指针
引用
第六章 指针和引用,6.1指针的概念,6.1指针的概念,数据在内存中是如何存取的?,系统根据程序中定义变量的类型,给变量分配一定的长度空间。字符型占1个字节,整型数占4个字节.。内存区的每个字节都有编号,称之为地址。,内存单元的地址,内存单元的内容,6.1指针的概念,数据在内存中是如何存取的?,系统根据程序中定义变量的类型,给变量分配一定的长度空间。字符型占1个字节,整型数占4个字节.。内存区的每个字节都有编号,称之为地址。,内存单元的地址,内存单元的内容,1 直接访问,按变量地址存取变量的值。cini;实际上放到定义 i 单元的地址中。,2 间接访问,将变量的地址存放在另一个单元p中,通过 p 取出变量的地址,再针对变量操作。,一个变量的地址称为该变量的指针。,如果在程序中定义了一个变量或数组,那么,这个变量或数组的地址(指针)也就确定为一个常量。,变量的指针和指向变量的指针变量,变量的指针就是变量的地址,当变量定义后,其指针(地址)是一常量。,可以定义一个变量专门用来存放另一变量的地址,这种变量我们称之为指针变量。在编译时同样分配一定字节的存储单元,未赋初值时,该存储单元内的值是随机的。,指针变量定义的一般形式为:,类型标识符*变量名,int*i_point;,i,2000H,int i;,&i:2000H,指针类型,变量名,指针变量定义的一般形式为:,类型标识符*变量名,int*i_point;,指针类型,变量名,指针变量同样也可以赋值:,int i,*i_point;i_point=,也可以在定义指针变量时赋初值:,int i;int*i_point=,*在定义语句中只表示变量的类型是指针,没有任何计算意义。,*在语句中表示“指向”。&表示“地址”。,一个指针变量只能指向同一类型的变量。即整型指针变量只能放整型数据的地址,而不能放其它类型数据的地址。,2000H,int i;int*i_point=,表示指向,表示类型,i,3,指针变量的引用,指针变量只能存放地址,不要将非地址数据赋给指针变量。,int*p,i;p=100;p=,void main(void)int a=10,b=100;int*p1,*p2;p1=,非法,指针变量赋值,指针变量引用,10 100,10 100,表示指向,void main(void)int a,b;int*p1,*p2;p1=,通过指针对变量赋值,指针变量赋值,指针变量引用,void main(void)int a,b;int*p1,*p2;*p1=10;*p2=100;coutatbendl;cout*p1t*p2endl;,绝对不能对未赋值的指针变量作“指向”运算。,int i,*p1;p1=,通过指针对变量赋值,但指针变量未赋值,即指针指向未知地址,用指针变量前,必须对指针变量赋值,输入a,b两个整数,按大小输出这两个数。,void main(void)int*p1,*p2,*p,a,b;cinab;p1=,b,a,p1,p2,&b,&a,100,10,p,&a,&b,&a,10 100,100 10,交换地址,虽然变量不变,但指向变量的指针发生变化,int a=3,*p;p=,+,-,*优先级相同,都是右结合性。,相当于a+。表达式为3,a=4,(*p)+;,4,int a=3,*p;p=,+,-,*优先级相同,都是右结合性。,2004H,*(p+)首先*p,然后p=p+1,指针指向下一个int单元 表达式为3,p=2004H。,*p+;,int a=3,*p;p=,+,-,*优先级相同,都是右结合性。,4,+(*p)*p=*p+1 a=4,+*p,int a=3,*p;p=,+,-,*优先级相同,都是右结合性。,2004H,*(+p),首先:p=p+1,然后取*p。即取p所指的下一个int单元的内容。表达式为5 p2004H,*+p,指针变量作为函数参数:函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。,指针变量作为函数参数与变量本身作函数参数不同,变量作函数参数传递的是具体值,而指针作函数参数传递的是内存的地址。,输入a,b两个整数,按大小输出这两个数。,void main(void)int*point1,*point2,a,b;cinab;point1=,swap(int*p1,int*p2)int t;t=*p1;*p1=*p2;*p2=t;,10,100,10,a=100,b=10,输出:a=100,b=10 100,10,输入a,b两个整数,按大小输出这两个数。,void main(void)int*point1,*point2,a,b;cinab;point1=,swap(int x,int y)int t;t=x;x=y;y=t;,10,100,10,x=100,y=10,输出:a=10,b=100 10,100,值传递,用指针变量作函数参数,在被调函数的执行过程中,应使指针变量所指向的参数值发生变化,这样,函数在调用结束后,其变化值才能保留回主调函数。,用指针变量作函数参数,可以得到多个变化了的值。,函数调用不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。,void grt(int*x,int*y,int*z)cout+*x,+*y,*(z+)endl;int a=10,b=40,c=20;void main(void)prt(,+*x:,*(z+):,11,41,20,12,42,20,*x=*x+1,*z;z=z+1,void main(void)int a=0,i,*p,sum;for(i=0;i*p;sum=s(p);cout“sum=”sumendl;,输入:1 3 5,sum=11,sum=13,sum=15,p,&a,1,p,&a,sum,10,sum,int s(int*p)int sum=10;sum=sum+*p;return sum;,11,11,sub(int*s)static int t=0;t=*s+t;return t;void main(void)int i,k;for(i=0;i4;i+)k=sub(,i=0,t=*s+t=0,k=0 sum=0,i=1,t=*s+t=1,k=1 sum=1,i=2,t=*s+t=3,k=3 sum=3,i=3,t=*s+t=6,k=6 sum=6,