vb中数据库指针怎么利用timer循环移动,并且还要同时显示在text中

vb中数据库指针怎么利用timer循环移动,并且还要同时显示在text中,第1张

先定义一个全局变量,记录指针

利用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的记录等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10094075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存