c语言,数组首地址的地址和首地址的内容居然是一样的,看懂了就进来看看吧

我定义了一个数组

int arr[5] = {0};
现在我输出arr和&arr
printf("%d %d\n", arr, &arr); 输出结果两个值是一样的。(vc6.0)

arr表示的是数组的首地址
&arr表示的是数组的首地址的地址
arr相当于一个指针, 我现在直接用printf输出arr相当于输出了arr中储存的内容(不是输出以该内容为地址的变量),其结果居然与arr的地址是相同的,这怎么可能。
当我输出*arr的时候结果是为零,这可以理解,因为他代表了该数组的第一个元素。但是和前面的联系起来看,就有问题了,arr的中储存的地址内容是他本身的地址,那个他指向的就是他本身,*arr的结果应该与arr相同才对,这到底怎么回事啊

理解这个很重要,当你理解之后你就会发现设计C语言的大师们是多么的聪明,这些设计非常利于C语言书写的简洁
a与&a都是指针,指针有两个要素
第一个是地址值,也就指向的位置,你打印出来的就是地址值,a与&a的地址值是一样的
第二个是类型(所指向的数据类型),a指向数组第一个元素,&a指向数组a,a+1后的地址值会偏移一个元素的长度,&a+1后的地址值会便宜一整个数组的长度,所以a与&a类型是不一样的

关于指针与数组的关系,理解之后对你写代码质量会有很大的帮助,当然一开始理解起来会有难度,有一句话说的好:在C语言中只有一维数组(N维数组的元素是数组),数组名作为指针时永远指向第一个元素,如
数组a[3] ,*a = a[0],
数组a[3][4], *a = a[0],只不过这时候a[0]又是一个数组,这时候a[0]又是指向它自己元素的第一个元素,又有*a[0] = a[0][0].
这种方式可以推广到N维数组,所有数组直接对数组名取地址(如&a)得到的指针指向该数组,而不是指向第一个元素,注意这点区别哦,理解了我上面所说的,就知道了

还有对你的疑问说说我的看法
“arr表示的是数组的首地址”:没错,arr就是指向第一个元素的指针
"&arr表示的是数组的首地址的地址":这句话不对,我更倾向于把&arr理解为指向数组arr的指针

“arr相当于一个指针, 我现在直接用printf输出arr相当于输出了arr中储存的内容(不是输出以该内容为地址的变量),其结果居然与arr的地址是相同的,这怎么可能。”:

arr只是一个符号,本身不是变量不存在存储内容的说法追问

我靠,你太牛逼了,膜拜啊,理解这个不太容易,像你这样讲清楚就更难了,你是应该有大四了吧

追答

你过奖了,理解了就好,指针跟数组是C的精髓,理解之后才能写出简洁高效的代码,我已经工作三年多了,有问题可以一起讨论o(∩_∩)o

追问

我刚上大一,能推荐我几本书读读吗,都说谭浩强的那本好,我觉得不行,讲的还算详细,但不透彻,我想求甚解!!

追答

我自学的时候一开始就是看谭浩强的,可以勉强入门吧,但这本书很不严谨也没有把握C的精髓,也就是深度不够,所以会让人看的越来越多的疑问
推荐你几本书给你:C和指针,C缺陷与陷阱,还有据说The C Programming Language非常不错,发明C语言的大牛写的,不过我还没真正看过
还可以推荐你学习linux操作系统,我是一边学习linux学的C,从操作系统从底层的角度来理解C的话,会更透彻直观,并且linux是开源操作系统,网上的资源也非常多

追问

恩,我这就去弄,我也要成为大牛,当我知道图灵,冯诺依曼这些人的那天起,我就发誓我要用我一生的时间去和他们齐名

追答

哈哈你这年轻人,志向真是远大啊,我很欣赏,不过你才大一,机会是有的!不过走技术的路线过程会很痛苦,我就送给你两个字吧,坚持!总有一天你会发现所有的努力都是有回报的,加油!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-14
c语言里面数组的地址也是首位的地址.这是定义的..& 是取地址。arr本来就是指针类型就是一个数据地址 &arr 、arr 他们指向的地址都是首位元素的地址 也是整个数组的地址。追问

去看看你楼上那个人发的链接,你就知道你错得很离谱,而且你没理解我的意思

第2个回答  2013-12-14
这个帖子分析得很精彩,楼主可以看看http://www.jb51.net/article/40769.htm
相似回答