资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,指针和数组的区别,C+/C,程序中,指针和数组在不少地方都是可以相互替换使用的,这就让人产生一种错觉,以为两者是,等价,的。,1.,指针和数组名占据的内存空间大小不一样,char str10;char*,pstr,=,str,;,cout,sizeof(str,);,cout,sizeof(pstr,);,第一行输出结果是:,10,,第二行输出结果是:,4,从这里我们可以看出:,数组名对应着(而不是指向)一块内存(数组所占的内存区域)或者说是指代数组这种数据结构,其,地址与容量,在生命期内保持,不变,,只有数组的,内容,可以改变。指针对应着一个占据,4,个字节(,Win32,)的内存区域,而指向这,4,个字节所存储的地址所对应的内存单元,它可以指向任意类型的内存块。因此,,sizeof(str,),值为数组占据的内存空间大小即,10,个字节,而,sizeof(pstr,),值为指针的值占据的内存空间大小即,4,个字节。,补充,数组,或是在静态存储区被创建(全局数组),或是在栈上被创建。数组名对应着,注意不是指向,一块内存,其地址与容量在生命期内保持不变(当然,使用了,realloc,(),的不算),只有数组的内容可以改变。,指针,可以随时指向任意类型的内存块,它的特征是,“,可变,”,,所以我们常用指针来操作动态内存。指针远比数组灵活,当然也就更危险。,Char*p,数组,a,为,HELLOWORLD,!,0,P,指向,A,用运算符,sizeof,可以计算出数组的容量(字节数)。(包括最后面的,0,)。指针,p,指向,a,,但是,sizeof(p,),的值却是,4,。这是因为,sizeof(p,),得到的是一个指针变量的字节数,相当于,sizeof(char,*),,而不是,p,所指的内存容量,siziof(char6),。,C+/C,不能知道指针所指的内存容量。,值得注意的是,当数组作为函数的参数进行传递时,,数组就自动退化为同类型的指针,。那么不论数组,a,的容量是多少,,sizeof(a,),始终等于,sizeof(char,*),。,2.,数组名不是指针,但是在一定的情况下转换为指代数组的首地址的指针,而这个数组名转为的指针只能是指针常量。,a.,将数组名直接赋值给指针,数组名转换为指向数组的首单元的常量指针。,b.,直接将数组名作为指针形参的时候,数组名则转换为指向数组的首单元的常量指针进行传递,如下程序,2,:,void,fun(char,str,),。,char str15;fun(str1);,注意:,数组名作为函数形参进行传递时,在子函数体内,它已经不再是一个指针常量,而是变成一个真正的指针,可以进行增减等操作,可以被修改。所以程序,2,中子程序第一条语句输出的,sizeof(str,),的值为,4.,既然数组名可以被看作指针常量,而常量是不能修改的,那么如下代码是不允许的:,char str10;,str,+;,但如下代码则合法的:,char str10;char*,pstr,=,str,;,pstr,+;,3.,使用指针访问数组和使用数组名访问数组本质不同。,char str7=”,ksarea,”;char*,pstr,=,str,;,cout,str3pstr3,endl,;,其中,str3,和,pstr3,返回的都是字符,r,,但是编译器产生的执行代码却不一样。对于,str3,,执行代码是从,str,开始,向后移动三个字节,然后取出其中的字符;而对于,pstr3,,执行代码是从,pstr,中取出地址,然后在其上加,3,,然后取出对应内存中的字符。当然,如果,pstr,是指向,int,型的指针,那么,pstr3,的处理过程是从,pstr,中取出地址,然后在其上加上,3*,sizeof(int,),,最后取出对应内存中的字符,其他的数据类型一次类推。,
展开阅读全文