C指针的用法总结.docVIP

  • 4
  • 0
  • 约7.04万字
  • 约 10页
  • 2016-12-22 发布于贵州
  • 举报
C指针的用法总结 char *p, **p, ***p; char p[],p[][],p[][][]; char *p[],*p[][],**p[],**p[][],*(*p)[],(**p)[],(**p)[][]; void (*pFun)(int i); 大神们看到这些东西脑袋里一定像蓝天白云一样清晰明了。。。 (1)关于指针与数组的存储 a、指针和数组在内存中的存储形式 数组p[N]创建时,对应着内存中一个数组空间的分配,其地址和容量在数组生命周期内一般不可改变。数组名p本身是一个常量,即分配数组空间的地址值,这个值在编译时会替换成一个常数,在运行时没有任何内存空间来存储这个值,它和数组长度一起存在于代码中(应该是符号表中),在链接时已经制定好了;而指针*p创建时,对应内存中这个指针变量的空间分配,至于这个空间内填什么值即这个指针变量的值是多少,要看它在程序中被如何初始化,这也决定了指针指向哪一块内存地址。 b、指针和数组的赋值与初始化 根据上文,一般情况下,数组的地址不能修改,内容可以修改;而指针的内容可以修改,指针指向的内容也可以修改,但这之前要为指针初始化。 如: int p[5]; p=p+1; 是不允许的 而p[0]=1; 是可以的; // int *p; p=p+1; 是允许的 p[0]=1; 是不允许的,因为指针没有初始化; // int i; int *p=i; p[0]=1; 是允许的; 对于字符指针还有比较特殊的情况。 如: char * p=abc; p[0]=d; 是不允许的 为什么初始化了的字符指针不能改变其指向的内容呢?这是因为p指向的是“常量”字符串,字符串abc实际是存储在程序的静态存储区的,因此内容不能改变。这里常量字符串的地址确定在先,将指针指向其在后。 而 char p[]=abc; p[0]=d; 是允许的 这是因为,这个初始化实际上是把常量直接赋值给数组,即写到为数组分配的内存空间。这里数组内存分配在先,赋值在后。 (2)关于一些表达式的含义 char *p, **p, ***p; char p[],p[][],p[][][]; char *p[],*p[][],**p[],**p[][],*(*p)[],(**p)[],(**p)[][]; 能清晰地知道以上表达式的含义吗?(知道的去死!) 第一组:char *p, **p, ***p; 分别为char指针;char*指针,即指向char*类型数据地址的指针;char**指针,即指向char**类型数据的指针;他们都是占4字节空间的指针。 如: char c=a; char *p=c; char **p1=p; char ***p2=p1; cout***p2endl; 第二组:char p[],p[][],p[][][]; 分别为一维,二维和三维char型数组,即数组,数组的数组,数组的数组的数组。可以如下的方式进行初始化: char pp[3]=ab; char pp1[3][3]={ab}; char pp2[3][3][3]={{ab}}; 现在我们尝试使用第二组三个数组名对应为第一组三个指针赋值,直接赋值的结果如下: p=pp; //正确 p1=pp1; //错误 p2=pp2; //错误 为什么p1和p2的赋值会出错呢?原因是数组名为给指针赋值的规则不是递归的,即数组的数组可以为数组的指针赋值,而不可以为指针的指针赋值。这里先了解到这个抽象的规则,下面讲完第三组表达式,等我们知道数组的指针和指针的数组如何书写后再对这一问题举例说明。 第三组:char *p[],*p[][],**p[],**p[][],*(*p)[],(**p)[],(**p)[][]; 这一类表达式的解析方法如下: 首先把整个表达式分为三部分, 数据类型和星号部分+p或括号内内容部分+中括号部分 如:char *(*p)[]分为?char* ,(*p) 和 [] ? ?“char*”表示最内层存储的数据类型“(*p)”表示最外层指针“[]”表示中间层数组(维数=中括号数目),因此上式表示一个一维数组的指针p,数组中的元素的数据类型是指针char*。同理,char

文档评论(0)

1亿VIP精品文档

相关文档