C数组名的思考

z415929053 2009-04-28 10:16:36
#include <stdio.h>

void main()
{
int a[3]={1,3,5};
printf("%x,%x,%x,%d\n",&a,a,&a[0],sizeof(a));
getch();
} 这个结果是ffc8 ,ffc8,ffc8 ,6,书上讲a就是数组的头地址,那么a=&a[0]=ff0c不错,可是现在&a也等于a 我就搞不懂,这个数组名a在内存中到底是个什么数据结构,怎么存储的?往高人指点。
...全文
223 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
winysbow 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 liao05050075 的回复:]
关于取数组地址(zz)2009-04-24 17:33
在文《csdn一道C语言题的学习》中,有关于对数组地址的操作。对于一个数组struct A,A就是指向数组的首地址,这个是在编译时确定的,对于取址操作符&,在运行时确定,&A的值也是数组的首地址。即A与&A的值是相同的,不过两者的含义有所不同。区别如下:
1)地址含义的不同,A又可以理解为&A[0],A+1,即表示&A[1];但是,对于&A+1,则表示是下个数组的首地址, 即A+size…
[/Quote]

up
z415929053 2009-04-28
  • 打赏
  • 举报
回复
很好很好,把这么多人讲的东西都包括进去了,谢谢你。
看来要学好指针还是要了解下编译原理啊。[Quote=引用 13 楼 liao05050075 的回复:]
关于取数组地址(zz)2009-04-24 17:33
在文《csdn一道C语言题的学习》中,有关于对数组地址的操作。对于一个数组struct A,A就是指向数组的首地址,这个是在编译时确定的,对于取址操作符&,在运行时确定,&A的值也是数组的首地址。即A与&A的值是相同的,不过两者的含义有所不同。区别如下:
1)地址含义的不同,A又可以理解为&A[0],A+1,即表示&A[1];但是,对于&A+1,则表示是下个数组的首地址, 即A+size…
[/Quote]
z415929053 2009-04-28
  • 打赏
  • 举报
回复
很好很好,把这么多人讲的东西都包括进去了,谢谢你。
看来要学好指针还是要了解下编译原理啊。
sean_zhou 2009-04-28
  • 打赏
  • 举报
回复
你的回答很不错,我补充一点 ,编译器把a当作&a看,但不把&a当a看,看看这个输出就知道了。 printf("%x,%x\n",*(&a),*a);呵呵大概有点明白了。[Quote=引用 8 楼 winysbow 的回复:]
你的疑问我以前也有过,你的意思是a既然是地址,那么&a就是地址的地址,
而在这里,这二者都是一样的地址内容,是这个意思吧。


a只是一个名称,如所有变量名称一样,由编译器来识别它。
&a在编译的时候,编译器还是认为它是变量a的地址,这个与词法分析和变量处理有关,可以看看那编译原理。
变量名a,如果后面没有带[],编译器人为它是一个变量内容,就如a=3,编译器人为a就是3,&a是a的地址。
这里a为数组名,因为…
[/Quote]
imdemon 2009-04-28
  • 打赏
  • 举报
回复
学C之后或之前学汇编,好处那是大大滴。。。

学C的时候需要靠想象和抽象来理解东西,汇编让你看到了具体的玩意儿。。。

http://www.shubulo.com/forum-198-1.html
liao05050075 2009-04-28
  • 打赏
  • 举报
回复
关于取数组地址(zz)2009-04-24 17:33
在文《csdn一道C语言题的学习》中,有关于对数组地址的操作。对于一个数组struct A,A就是指向数组的首地址,这个是在编译时确定的,对于取址操作符&,在运行时确定,&A的值也是数组的首地址。即A与&A的值是相同的,不过两者的含义有所不同。区别如下:
1)地址含义的不同,A又可以理解为&A[0],A+1,即表示&A[1];但是,对于&A+1,则表示是下个数组的首地址, 即A+sizeof(A)。
2)取值方法的不同,显然*A即为A[0],*(A+1)即为A[1],这是常用的方式。*(&A)在运行时*和&相互抵消,值仍然是指向数组A的首地址。要取A[0]的值,应该用**(&A)才可。相似的,取A[1]的值,应该是*(*(&A)+1)。注意跟**(&A+1)的区别,后者是取下个数组首个元素的值。这种方式一般不会采用,不过,可以学习下,以当消遣之用。

http://hi.baidu.com/angler552/blog/item/9bad2258f9c4e889800a18d7.html
winysbow 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zjl_1026_2001 的回复:]
引用 7 楼 sean_zhou 的回复:
指针常量不太明白什么意思,发现你的回答有点好引用 6 楼 zjl_1026_2001 的回复:
在C中数组名是个指针常量,其值就是数组的首地址,因为是个指针常量,所以你的地址引用是无效的 呵呵
[/Quote]
地址引用无效
你试一下*(a+1)和*(&a+1)的输出,是完全不同的。
winysbow 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zjl_1026_2001 的回复:]
引用 7 楼 sean_zhou 的回复:
指针常量不太明白什么意思,发现你的回答有点好引用 6 楼 zjl_1026_2001 的回复:
在C中数组名是个指针常量,其值就是数组的首地址,因为是个指针常量,所以你的地址引用是无效的 呵呵
[/Quote]
地址引用无效
你试一下*(a+1)和*(&a+1)的输出,是完全不同的。
sean_zhou 2009-04-28
  • 打赏
  • 举报
回复
我这样理解看行不行,其实就是三楼讲的引申下,a存在CPU中的另外一个地方,它映射到所定义的数组,对a的所以的操作都是操作a所映射的数组,而不是a本身,这样就可以解释前面的&a=a,和sizeof(a)=6了,个人之见,。
6楼的说无效可是确实&a能得出值啊。
沙漠里的海豚 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sean_zhou 的回复:]
指针常量不太明白什么意思,发现你的回答有点好引用 6 楼 zjl_1026_2001 的回复:
在C中数组名是个指针常量,其值就是数组的首地址,因为是个指针常量,所以你的地址引用是无效的 呵呵
[/Quote]

呵呵 楼下的解释的还不错 你仔细看看

实在不明白你就print一下

printf("%x", &2);
winysbow 2009-04-28
  • 打赏
  • 举报
回复
你的疑问我以前也有过,你的意思是a既然是地址,那么&a就是地址的地址,
而在这里,这二者都是一样的地址内容,是这个意思吧。


a只是一个名称,如所有变量名称一样,由编译器来识别它。
&a在编译的时候,编译器还是认为它是变量a的地址,这个与词法分析和变量处理有关,可以看看那编译原理。
变量名a,如果后面没有带[],编译器人为它是一个变量内容,就如a=3,编译器人为a就是3,&a是a的地址。
这里a为数组名,因为a后面带了[],编译器就认为它是数组的地址,也就是a即为&a。
这样说不知道你明白否。

补充说明一点:
这里的a和&a的类型,他们虽然地址是一样的,但他们的类型是不同的。
地址a+1与&a+1的效果是不同的。
int a[3]={1,3,5};
*(a+1)=2;这里加1指针向后移动一个int空间。
*(&a+1)的值是不可预测的,因为它指向整个数组后面的地址,这里加1向后移动整个数组的空间。
sean_zhou 2009-04-28
  • 打赏
  • 举报
回复
指针常量不太明白什么意思,发现你的回答有点好[Quote=引用 6 楼 zjl_1026_2001 的回复:]
在C中数组名是个指针常量,其值就是数组的首地址,因为是个指针常量,所以你的地址引用是无效的 呵呵
[/Quote]
沙漠里的海豚 2009-04-28
  • 打赏
  • 举报
回复
在C中数组名是个指针常量,其值就是数组的首地址,因为是个指针常量,所以你的地址引用是无效的 呵呵
sean_zhou 2009-04-28
  • 打赏
  • 举报
回复
不大明白你的a是有编译器把地址用a来表示的这句话。[Quote=引用 3 楼 zlaxr8888 的回复:]
数组名,其实是指针常量,a,就是指针啊。其实在内存中,没有存a,a是有编译器把地址用a来表示的 。
[/Quote]
  • 打赏
  • 举报
回复

main()
{
int a[3]={1,3,5};
int *b=a;
printf("%x,%x,%x,%x,%x,%d\n",&b,b,&a,a,&a[0],sizeof(a));
getch();

}


平时没注意,这样对比下吧
zlaxr8888 2009-04-28
  • 打赏
  • 举报
回复
数组名,其实是指针常量,a,就是指针啊。其实在内存中,没有存a,a是有编译器把地址用a来表示的 。
Paradin 2009-04-28
  • 打赏
  • 举报
回复
都是编译器的事情
&a时把a看做一个整体取地址,&a+1跳了一整个数组的长度
a只是第一个元素的地址,因而a+1只跳到第二个元素

你打印下 &a+1 和 a+1的值可能对你理解有所帮助
sean_zhou 2009-04-28
  • 打赏
  • 举报
回复
mark

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧