为了理解属语言的指针数组与数组指针,特写了如下代码。然后在执行的过程中又引出个问题,看来一些多动手,才会发现原本自己觉得懂的东西原来不是那么的扎实。
且看如下代码:
正确代码:
#include <stdio.h>
int main (int argc,char * argv[])
{
int * ParrayVal[2];/*ParrayVal[2] have three elements,each one is a (int *) pointer.*/
int (*arrayPVal)[2]; /* arrayPVal is one pointer,pointer to a array have two int element.*/
int a=1,b=2,c=3;
ParrayVal[0]=&a;
ParrayVal[1]=&b;
ParrayVal[2]=&c;
printf("&a=%p\n",&a);
printf("&b=%p\n",&b);
printf("&c=%p\n",&c);
printf("ParrayVal[0]=%p\n",ParrayVal[0]);
printf("ParrayVal[1]=%p\n",ParrayVal[1]);
printf("ParrayVal[2]=%p\n",ParrayVal[2]);
int array[2]={3,4};
arrayPVal=&array;
printf("array=%p\n",array);
printf("array=%p\n",&array);
int i=0;
for (i;i<=1;i++)
{
printf("array[i]=%d\n",(*arrayPVal)[i]);
}
return 0;
}
错误代码:
#include <stdio.h>
int main (int argc,char * argv[])
{
int * ParrayVal[2];/*ParrayVal[2] have three elements,each one is a (int *) pointer.*/
int (*arrayPVal)[2]; /* arrayPVal is one pointer,pointer to a array have two int element.*/
int a=1,b=2,c=3;
ParrayVal[0]=&a;
ParrayVal[1]=&b;
ParrayVal[2]=&c;
printf("&a=%p\n",&a);
printf("&b=%p\n",&b);
printf("&c=%p\n",&c);
printf("ParrayVal[0]=%p\n",ParrayVal[0]);
printf("ParrayVal[1]=%p\n",ParrayVal[1]);
printf("ParrayVal[2]=%p\n",ParrayVal[2]);
int array[2]={3,4};
arrayPVal=array;
printf("array=%p\n",array);
printf("array=%p\n",&array);
int i=0;
for (i;i<=1;i++)
{
printf("array[i]=%d\n",(*arrayPVal)[i]);
}
return 0;
}
红色部分是这两段代码的唯一区别,如果上进去调试,这两段代码的执行结果都不会出问题。但是第二个代码会有告警。为了搞明白这个原因。同时参考了下网上各位达人的帖子总结如下。
为什么arrayPVal=array 和 arrayPVal=&array 结果是相同的,但是到底有什么差别呢?
1.他们的值确实相同,即指向的内存地址都是相同的。
2.他们的类型不同,array 通常表示数组元素的首地址,结合上述代码的描述,其退化成一个int *的指针类型。而&array表示的是一个数组指针,指向的一个int [2]的数组。
所以两者在类型上是不同的。
一个可以等价于 :int * a;
一个是: int (*a) [2];
-------------------以下具体也不是太清楚,请大家继续评论-----------------------------------
再说说(*arrayPVal)[i].首先 arrayPVal 是一个数组指针。
arrayPVal=&array赋值后,我们暂且记住对数组首地&后,相当于做了一个强制类型转换,把一个int *指针转化为 int (*)[ ] 指针。
他的值等于array数组第一个元素的地址的地址。*arrayPVal在值上等于 &array[0]; 不知到下面的为什么要写成这样?
printf("array[0]=%d\n",**arrayPVal);
printf("array[1]=%d\n",*(*arrayPVal+1));