下图选自《C语言其实很简单》第8章:
问:请问张老师!书上第227页一句话:指针变量a本身的地址(a所在内存字节编号)是数组的地址,数值上与元素a[0]的地址相等!
这句话是什么意思,我看不懂!为什么指针变量所储存的地址跟它本身的地址,相等呢?
答:一本书的这一页是第5页,我上面再写个5,可以吧
这是规定,没为什么
问:那一个数组的第一个元素是不是也可以定义一个真实的指针变量,来储存第一个元素的地址呢?
答:a是数组名,所以a的地址也是a0的地址。a也是个假想的指针变量,既然是假想的,不能跟真的一模一样,这个假指针特点就是储存的地址跟它本身的地址相等,而且地址不可更改。
int a[5];
int *p;
p=&a[0];
可以的呀
p=&a[0]; 等价于 p=a;
因为 &a[0] 等价于 a
因为 a[0] 等价于 *(a+0) 为什么?语法糖公式,必须熟练掌握!
所以 &a[0] 等价于 &*(a+0)
&和*抵消,所以就是a+0,那就是a了。所以 &a[0] 等价于 a
语法糖公式推也能推出来。好玩不,指针就是游戏,很好玩的
任何一种方法都可以得出结论。
问:老师!我感觉数组名跟变量一样,也可以表示整个数组的空间!比如:int a[]={1,2,3};printf("%d",sizeof(a)); 最后的结果就是12,说明把数组的整个空间都涵盖了!数组名有两个含义:一个是指针常量,一个是数组的整个空间。
这样理解正确么
指针变量占4个字节,而int a[]={1,2,3};printf("%d",sizeof(a)); 最后的结果就是12,不是4,请问老师什么时候数组名用做指针,什么时候不用做指针呢?
答:规定:sizeof(数组名)返回整个数组占用的字节数,sizeof(指针变量)返回4
这是规定。不能你那样认为呀。
记住要点,把握住要点,我们《C语言其实很简单》中强调的概念要点,一定要把握住!不要总持怀疑态度,总觉得我们给的概念和要点是错的,然后非要自己总结一套……那样你会走很多弯路!
看你这几次问的这些问题,都是属于这种情况。
我们《C语言其实很简单》是十几年教学经验的汇总,又参考了大量权威教材,更得到专家的多次认可,还参加过比赛……所以不要质疑,里面给大家总结的都是正确的。都要认真牢记!而且里面的这些总结的概念,都是经过无数次同学的摔打总结出来的,让大家少走弯路的概念,你掌握牢,很多问题可以消灭于无形!能节省你很多很多时间当然欢迎大家提出问题,指正本书或讨论。但对于初学者,请先学扎实基本功,然后我们再讨论和质疑。否则,你将陷入弯路,耽误自己的时间。
PS:《C语言其实很简单》出版5年了。除勘误外,未有发现任何原则问题。你若喜欢,点个“在看”