拈花小仙 发表于 2014-10-30 18:03:41

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呢?

我技术很差,麻烦大神们讲的通俗易懂些。
如果有图那就更好啦~


仰望天上的光 发表于 2014-10-30 18:03:42

一般的编程应用完全用不到这些东西,或者不用这些东西也可以应付。这些东西涉及C语言指针中比较晦涩的部分,如果能够用平常心跳过这个部分是再好不过的;然而,总有一些人不彻底解决这些问题就不能安心继续学习(不是说这些人不好啊,而是有些人的本性就是这样。。。其实我自己当年也是不把这些问题搞清楚就不能安心学习)。既然这样,就干脆依据C语言标准,认真将指针和数组的问题一劳永逸的搞清楚比较合算。我个人推荐一下这个链接中的一系列文章,希望对这个问题有疑惑的同学可以认真看完。
http://blog.csdn.net/supermegaboy/article/category/622235

血月 发表于 2014-10-30 18:18:01

本帖最后由 血月 于 2014-10-30 18:19 编辑

废话!
当然是 a 了
a=a    //因为a是个指针

比如 “aaa“+1 输出 ”aa"





拈花小仙 发表于 2014-10-30 18:28:42

血月 发表于 2014-10-30 18:18
废话!
当然是 a 了
a=a    //因为a是个指针


是呀,我是这么想的呀,可这是为什么呢?

fireofsun 发表于 2014-10-30 19:22:57

a跟&a都不能代表数组,a是数组名,是个指针,指向的是数组的第一个元素,即a等于&a,既然a是指针,那么&a就是取指针的地址,得到的是二级地址就更不可能代表数组了

风之残月 发表于 2014-10-30 19:41:28

a 是这个数组的首地址,是一个指针,可以说是代表整个数组
&a 是获取指针 a 的地址,不代表整个数组

风之残月 发表于 2014-10-30 19:52:00

忘了下面还有问题
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:16:38

本帖最后由 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:18:09

本帖最后由 avatar10010 于 2014-10-30 20:19 编辑

1

风之残月 发表于 2014-10-30 20:24:53

avatar10010 发表于 2014-10-30 20:18
1

:sweat: 我是回答问题的,上面的“忘了下面还有问题”是因为我只回答了标题的问题,忘了下面还有其他的问题,不过对你的热心表示支持:handshake

拈花小仙 发表于 2014-10-30 23:03:47

avatar10010 发表于 2014-10-30 20:16
问题1:
a代表数组元素首地址,且该数组是int类型,所以a+1当然只偏移一个int了,这也说明了为什么a和* ...

如果a仅代表首地址,为什么sizeof(a) 是40,而不是4呢?

漩涡鸣人 发表于 2014-10-30 23:37:00

本帖最后由 漩涡鸣人 于 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

ko12 发表于 2014-11-11 23:13:27

这题好给力。我喜欢。{:5_101:}

Victory_6226 发表于 2014-11-13 22:47:37

很好的问题,知识点很多:lol:
页: [1]
查看完整版本: int a[10] a代表整个数组 还是&a代表整个数组