C语言int a[5],*p; p=a;和p=&a;的对错问题~希望详细点,谢谢啦

谭说前者错的……不理解…………

先上结论:

对于int a[5],*p;

p=a; 或p=&a[0]是正确的

p=&a严格来说是错误的

首先要搞清楚a与&a的区别:a表示数组首元素的首地址,即元素a[0]的地址;&a表示整个数组的地址。二者的值是相同的,但意义并不一样。正如成都市政府与四川省政府的地址都在成都,但二者表示的含义不同。

如下图所示,a表示a[0]的地址

&a则表示整个数组的地址

二者的值之所以相同,因为地址是取自第一个字节的地址,数组元素a[0]的第一个字节与整个数组的第一个字节显然是相同的。

a与&a[0]及&a的值如下:

1244980,1244980,1244980

a+1与&a[0]+1值如下:

1244984,1244984

但&a+1的值为1245000。

a+1与&a[0]+1都是表示下一个数组元素的地址,以元素为单位相加,地址值+4。而&a+1表示下一个数组的地址,以数组为单位相加,地址值+20.

所以,p=a; 或p=&a[0]是正确的,表示指针p指向数组的首元素。

温馨提示:内容为网友见解,仅供参考
第1个回答  2017-11-03
有了int a[5],*p;,p=&a;显然就是错误的。int a[5],*p;说明了a和p都是int *型指针,只是a是常指针,p是指针变量,那么p=a;就合情合理;&a是指向a[5]的指针,与它类型匹配的是int (*)[5],而不是int *。所以p=&a;的等号两边类型不匹配,编译都过不了……
第2个回答  2011-06-01
1.int a[10],*p;
p=a;//a是首地址
2.int a[10],*p=a;//定义时赋值
3.int a[10],*p;
p=&a[0];
以上都是等效的,没有p=&a的
谭浩强是说前者对
第3个回答  2011-05-30
p=&a,是把a的地址赋给p,再通过*p得到a所赋给p的地址,取a里面的内容 ,对于数组的话好像两个都对的,我用VC6.0编译的时候都通过的
第4个回答  2011-05-30
不要太相信书上写的话了,遇到问题最好的办法是动手试一试
听过的会忘记,看过的只能记住,只有做过的才能理解
相似回答