int a[10] a代表整个数组 还是&a代表整个数组
本帖最后由 风之残月 于 2014-11-9 22:37 编辑#include <stdio.h>
int main()
{
int a = {1,2,3,4,5,6,7,8,9,10};
printf("%p\n",&a);
printf("%p\n",a);
printf("%p\n",a + 1);
printf("%p\n",&a + 1);
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(&a));
return 0;
}
输出结果:
0017FDE4
0017FDE4
0017FDE8
0017FE0C
40
4
如果a代表数组整个元素的地址,那么 a + 1 为什么 = 0017FDE8 只偏移一个int?
如果&a代表数组整个元素的地址,那么sizeof(&a) 为什么等于 4,而不是40呢?
我技术很差,麻烦大神们讲的通俗易懂些。
如果有图那就更好啦~
一般的编程应用完全用不到这些东西,或者不用这些东西也可以应付。这些东西涉及C语言指针中比较晦涩的部分,如果能够用平常心跳过这个部分是再好不过的;然而,总有一些人不彻底解决这些问题就不能安心继续学习(不是说这些人不好啊,而是有些人的本性就是这样。。。其实我自己当年也是不把这些问题搞清楚就不能安心学习)。既然这样,就干脆依据C语言标准,认真将指针和数组的问题一劳永逸的搞清楚比较合算。我个人推荐一下这个链接中的一系列文章,希望对这个问题有疑惑的同学可以认真看完。
http://blog.csdn.net/supermegaboy/article/category/622235 本帖最后由 血月 于 2014-10-30 18:19 编辑
废话!
当然是 a 了
a=a //因为a是个指针
比如 “aaa“+1 输出 ”aa"
血月 发表于 2014-10-30 18:18
废话!
当然是 a 了
a=a //因为a是个指针
是呀,我是这么想的呀,可这是为什么呢? a跟&a都不能代表数组,a是数组名,是个指针,指向的是数组的第一个元素,即a等于&a,既然a是指针,那么&a就是取指针的地址,得到的是二级地址就更不可能代表数组了 a 是这个数组的首地址,是一个指针,可以说是代表整个数组
&a 是获取指针 a 的地址,不代表整个数组 忘了下面还有问题
a + 1 因为a代表了这个数组,为数组操作,而数组类型是int ,int 一般是4个字节(视情况而定),所以地址是 a + 1 * 4 = 0017FDE4 + 4 = 0017FDE8
&a 是首地址 a 的地址,在这里只是一个纯粹的地址(指针),一个指针一般占4个字节(视情况而定), 所以sizeof(&a) = 4
a 代表了整个数组, 所以sizeof(a) = sizeof(int) * 10 = 4 * 10 = 40 本帖最后由 avatar10010 于 2014-10-30 20:22 编辑
问题1:
a代表数组元素首地址,且该数组是int类型,所以a+1当然只偏移一个int了,这也说明了为什么a和*(a+1)是等价的
问题2:
&a是把a看做 一个整体(a可以看做是一个特殊的变量)求他的地址,这跟int a;&a是一样的,所以&a+1会偏移40个字节,但&a终究还是个指针变量,所有的指针变量都是占4个字节
本帖最后由 avatar10010 于 2014-10-30 20:19 编辑
1 avatar10010 发表于 2014-10-30 20:18
1
:sweat: 我是回答问题的,上面的“忘了下面还有问题”是因为我只回答了标题的问题,忘了下面还有其他的问题,不过对你的热心表示支持:handshake avatar10010 发表于 2014-10-30 20:16
问题1:
a代表数组元素首地址,且该数组是int类型,所以a+1当然只偏移一个int了,这也说明了为什么a和* ...
如果a仅代表首地址,为什么sizeof(a) 是40,而不是4呢? 本帖最后由 漩涡鸣人 于 2014-10-30 23:39 编辑
拈花小仙 发表于 2014-10-30 23:03
如果a仅代表首地址,为什么sizeof(a) 是40,而不是4呢?
编译器处理sizeof这个关键字,会通过后面的变量或数组名,直接将表达式改为要申请的空间字节数
也就是说,sizeof(a)在编译之后指令里直接写了“40”这个数。
sizeof不管后面的名字实际代表地址还是变量名,他只是把将为他申请的空间长度直接代替了
举例:
如果定义int a;
sizeof(a)直接被代替成了10*sizeof(int)的结果,接着又被代替为一个数值,一般机器结果是40
这题好给力。我喜欢。{:5_101:} 很好的问题,知识点很多:lol:
页:
[1]