先定义一个全局变量,记录指针
利用timer的话,你在TIMER里设置好时间,然后事件里设置查询记录指针位置的数据,查询完了把内容显示在TEXT里,然后记录指针的全局变量+1即可。
查询前判断一下,记录指针的全局变量是否超过了记录总数,超过了就设置为0,从头开始。
1指针与一维数组
int a[5]={0,1,2,3,4},i,j,p;
① p+i=a+i=&a[i],即p+i、a+i 均表示第i个元素的地址&a[i]。
② (p+i) =(a+i)=p[i]= a[i]。即(p+i), (a+i), p[i]均表示第i个元素值a[i]。
其中p[i] 的运行效率最高。
由上所述可知:一维数组的第i个元素可用四种方式引用,即: a[i]、(p+i) 、(a+i)、p[i]。
2指针与二维数组
第i行行地址 a+i、&a[i]
第i行首地址(第i行第0列地址) a[i]、 (a+i)、 &a[i][0]
元素a[i][j]的地址 a[i]+j 、(a+i)+j 、&a[i][0]+j、&a[i][j]
第i行第j列元素值 (a[i]+j) 、 ((a+i)+j) 、 (&a[i][0]+j)、a[i][j]
为了加深读者对二维数组a的行地址、行首地址、元素地址、元素值的各种表示方式的理解,现举例如下:
例79定义二维数组a[3][3],用二种方式输出行地址,用三种方式输出行首地址,用四种方式输出所有元素地址及元素值。
# include <iostreamh>
void main(void)
{ int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
for (int i=0;i<3;i++)
{ cout<<"&a["<<i<<"]="<<&a[i]<<"="<<a+i<<endl; //输出第i行行地址
cout<<"a["<<i<<"]="<<a[i]<<"="<<(a+i)<<"="<<&a[i][0]<<endl; //行首地址
for (int j=0;j<3;j++)
{ cout<<"&a["<<i<<"]["<<j<<"]="<<a[i]+j<<"="<<(a+i)+j<<"="<<
&a[i][0]+j<<"="<<&a[i][j]<<endl; //输出元素a[i][j]的地址
cout<<"a["<<i<<"]["<<j<<"]="<<(a[i]+j)<<"="<<((a+i)+j)<<
"="<<(&a[i][0]+j)<<"="<<a[i][j]<<endl; //输出元素a[i][j]的值
}
}
}
3字符串与指针
# include <iostreamh>
# include <stringh>
void main(void)
{ char p1="I am a student" ;
char s1[30],s2[30];
strcpy( s1,p1); //用命令拷贝字符串
char p2=s2; //将数组s2首地址赋p2
for (;p2++=p1++;); //用指针拷贝字符串
cout<<"s1="<<s1<<endl;
cout<<"s2="<<s2<<endl;
}
执行后输出:
s1= I am a student
s2= I am a student
说明:
(1)编译系统执行定义语句char p1="I am a student" 时,首先为字符串"I am a student "分配内存空间,然后将该内存空间首地址赋给指针变量p1。
(2)用指针变量拷贝字符串过程是,先将指针变量p2指向字符串数组s2的首地址,然后通过赋值语句p2=p1将字符由字符串s1中拷贝到s2中,再移动p1、p2到下一个字符单元,依次循环直到字符串结束符'\0'为止,如图78所示。全部拷贝过程用一个for语句完成。在for(;p2++=p1++;)语句中,表达式:
p2++=p1++ 等价于下列三条语句,
p1=p2; // s2[i]=s1[i],将指针p1所指s1[i]赋给指针p1所指s2[i]。
p1++; //指针p1加1指向s1的下一个元素
p2++; //指针p2加1指向s2的下一个元素
上述语句不断循环,直到p1指向结束字符'\0'=0时,for 语句因条件为假而结束。从而完成字符串s1拷贝到字符数组s2的任务。
(3)指针变量p1可以作为拷贝函数strcpy(s1,p1)的参数。
4字符型指针变量与字符数组的区别
char pc ,str[100];
小结 字符数组s[100] 指针变量pc
(1)分配内存 分配100个单元 分配4个单元。
(2)赋值含义 字符串放到数组存储空间 先将字符串存放到内存
将存放串的首地址送到pc中。
(3)赋值方式 只能逐个元素赋值 串地址可赋给pc
(4)输入方式: 串直接输入字符数组 不能将字符串直接输入指针变量
(5)值的改变: 字符数组首地址不能改变 指针变量的值可以改变
4指针与数组运算
用指针变量求一维实型数组元素和,并输出数组每个元素的值及数组和。
# include <iostreamh>
void main( void )
{ int a[5]={1,2,3,4,5};
int p,p1;
p=&a[0];
p1=&a[4]+1;
int sum=0;
for(;p<p1;p++)
{
cout<<p<<endl;
sum+=p;
}
cout<<"Sum ="<<sum<<endl;
}
5.指针运算符的混合运算与优先级
(1)指针运算符 与取地址运算符&的优先级相同,按自右向左的方向结合。
设有变量定义语句: int a, p=&a;
则表达式:&p 的求值顺序为先""后"&",即& (p)=&a=p 。
而表达式:&a 的求值顺序为先"&"后"",即 (&a)=p=a 。
(2)"++"、"――"、""、"&"的优先级相同,按自右向左方向结合。下面结合例子加以说明。设有变量定义语句:
int a[4]={100,200,300,400},b;
int p=&a[0];
为了叙述方便,假设系统给数组a分配的首地址为1000,如图74所示。
① b=p++;
按自右向左结合的原则,表达式 p++ 求值序顺为先"++"后"",即:(p++)。由于"++"在p之后为后置++运算符,所以表达式的实际 *** 作是先取p值,后进行p++的自加 *** 作。即赋值表达式 b=p++; 等同于下面两条语句:
b=p; // b=p=a[0]=100
p++; //p=p+sizeof(int)= 1004
最后运算的结果为b=100,p=1004指向a[1]。
② b=++p;
按自右向左结合的原则,表达式 ++p 求值顺序为先"++"后"",即:(++p)。由于++在p之前为前置++运算符,所以表达式的实际 *** 作是进行++p的自加 *** 作,后取p值。即赋值表达式 b=++p; 等同于下面两条语句:
++p; //p=p+sizeof(int)= 1008,指向a[2]
b=p; // b=p=a[2]=300
最后运算的结果为b=300,p=1008指向a[2]。
③ b=(p)++;
由于括号内优先运算,所以表达式先取出p(即a[2])的值并赋给b,然后将p的值即a[2]内容加1。所以表达式等同于下面两条语句:
b=p; //b=a[2]=300
a[2]++ ; // a[2]=300+1=301
④ b=(p++);
由①可知,该表达式等同于p++,运算结果为:
b=p; //b=a[2]=301
p++; // p=p+sizeof(int)=1012,指向a[3]
⑤ b=++p ;
该表达式先进行""运算,再进行"++"运算,即先取出p的值,再将该值加1。因此表达式实际进行了如下运算:b=++(p)=++a[3]=400+1=401; p仍指向a[3]不变。
将上述讨论中各语句汇总为例题如下:
例75指针运算符""、"&"、"++"优先级与结合律示例。
# include <iostreamh>
main()
{ int a[4]={100,200,300,400},b;
int p=&a[0];
cout<<'\t'<<"p="<<p<<endl;
b=p++;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=++p;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=(p)++;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=(p++);
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
b=++p;
cout<<"b="<<b<<'\t'<<"p="<<p<<endl;
}
运行结果为:
p=0x0065FDE8
b=100 p=0x0065FDEC
b=300 p=0x0065FDF0
b=300 p=0x0065FDF0
b=301 p=0x0065FDF4
b=401 p=0x0065FDF4
说明:在定义数组时,数据a的地址是由 *** 作系统存储管理动态分配的,因此,数组a的地址是不确定的,每次运行的结果都可能会不同。一般用十六进制数表示。本例中系统为数组a分配的首地址为0x0065FDE8。而在图74中所假设的地址1000~1016完全是为了便于读者理解。注(本题红色的为容易出错的)
6、指针和结构类型的关系
可以声明一个指向结构类型对象的指针。
例十二:
struct MyStruct
{
int a;
int b;
int c;
};
struct MyStruct ss={20,30,40};
//声明了结构对象ss,并把ss 的成员初始化为20,30 和40。
struct MyStruct ptr=&ss;
//声明了一个指向结构对象ss 的指针。它的类型是
//MyStruct ,它指向的类型是MyStruct。
int pstr=(int)&ss;
//声明了一个指向结构对象ss 的指针。但是pstr 和
//它被指向的类型ptr 是不同的。
请问怎样通过指针ptr 来访问ss 的三个成员变量?
答案:
ptr->a; //指向运算符,或者可以这们(ptr)a,建议使用前者
ptr->b;
ptr->c;
又请问怎样通过指针pstr 来访问ss 的三个成员变量?
答案:
pstr; //访问了ss 的成员a。
(pstr+1); //访问了ss 的成员b。
(pstr+2) //访问了ss 的成员c。
虽然我在我的MSVC++60 上调式过上述代码,但是要知道,这样使
用pstr 来访问结构成员是不正规的,为了说明为什么不正规,让我们
看看怎样通过指针来访问数组的各个单元: (将结构体换成数组)
所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存
放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的
各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是
别的什么对齐,需要在相邻两个成员之间加若干个"填充字节",这就导
致各个成员之间可能会有若干个字节的空隙。
所以,在例十二中,即使pstr 访问到了结构对象ss 的第一个成
员变量a,也不能保证(pstr+1)就一定能访问到结构成员b。因为成员
a 和成员b 之间可能会有若干填充字节,说不定(pstr+1)就正好访问
Private Sub Form_Load()
'数据库初始化
'连接数据库,AppPath 为当前目录,数据库mdb为Access数据库,按实际更改,其余的不能更改
Adodc1ConnectionString = "Provider=MicrosoftJetOLEDB40;Data Source=" & AppPath & "\数据库mdb;Persist Security Info=False"
Adodc1RecordSource = "表1" '表1 为数据库里的一个表,按实际更改
Adodc1Refresh '刷新数据
Adodc1RecordsetMoveNext
End Sub
一定行!你是用adodc来连数据库的吧
以上就是关于vb中数据库指针怎么利用timer循环移动,并且还要同时显示在text中全部的内容,包括:vb中数据库指针怎么利用timer循环移动,并且还要同时显示在text中、object类与指针关系、在数据库中如何把记录指针移到记录号为5的记录等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)