鱼C论坛

 找回密码
 立即注册
查看: 7982|回复: 13

int a[10] a代表整个数组 还是&a代表整个数组

[复制链接]
发表于 2014-10-30 18:03:41 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 风之残月 于 2014-11-9 22:37 编辑

#include <stdio.h>
int main()
{
    int a[10] = {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语言标准,认真将指针和数组的问题一劳永逸的搞清楚比较合算。我个人推荐一下这个链 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-30 18:03:42 | 显示全部楼层
一般的编程应用完全用不到这些东西,或者不用这些东西也可以应付。这些东西涉及C语言指针中比较晦涩的部分,如果能够用平常心跳过这个部分是再好不过的;然而,总有一些人不彻底解决这些问题就不能安心继续学习(不是说这些人不好啊,而是有些人的本性就是这样。。。其实我自己当年也是不把这些问题搞清楚就不能安心学习)。既然这样,就干脆依据C语言标准,认真将指针和数组的问题一劳永逸的搞清楚比较合算。我个人推荐一下这个链接中的一系列文章,希望对这个问题有疑惑的同学可以认真看完。
http://blog.csdn.net/supermegaboy/article/category/622235
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-30 18:18:01 | 显示全部楼层
本帖最后由 血月 于 2014-10-30 18:19 编辑

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

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





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-10-30 18:28:42 | 显示全部楼层
血月 发表于 2014-10-30 18:18
废话!
当然是 a 了
a=a[0]    //因为a是个指针

是呀,我是这么想的呀,可这是为什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-30 19:22:57 | 显示全部楼层
a跟&a都不能代表数组,a是数组名,是个指针,指向的是数组的第一个元素,即a等于&a[0],既然a是指针,那么&a就是取指针的地址,得到的是二级地址就更不可能代表数组了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-30 19:41:28 | 显示全部楼层
a 是这个数组的首地址,是一个指针,可以说是代表整个数组
&a 是获取指针 a 的地址,不代表整个数组
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-30 20:16:38 | 显示全部楼层
本帖最后由 avatar10010 于 2014-10-30 20:22 编辑

问题1:
a代表数组元素首地址,且该数组是int类型,所以a+1当然只偏移一个int了,这也说明了为什么a[1]和*(a+1)是等价的
问题2:
&a是把a[10]看做 一个整体(a[10]可以看做是一个特殊的变量)求他的地址,这跟int a;&a是一样的,所以&a+1会偏移40个字节,但&a终究还是个指针变量,所有的指针变量都是占4个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-30 20:18:09 | 显示全部楼层
本帖最后由 avatar10010 于 2014-10-30 20:19 编辑

1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-30 20:24:53 | 显示全部楼层

:sweat: 我是回答问题的,上面的“忘了下面还有问题”是因为我只回答了标题的问题,忘了下面还有其他的问题,不过对你的热心表示支持:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-10-30 23:03:47 | 显示全部楼层
avatar10010 发表于 2014-10-30 20:16
问题1:
a代表数组元素首地址,且该数组是int类型,所以a+1当然只偏移一个int了,这也说明了为什么a[1]和* ...

如果a仅代表首地址,为什么sizeof(a) 是40,而不是4呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[10];
sizeof(a)直接被代替成了10*sizeof(int)的结果,接着又被代替为一个数值,一般机器结果是40

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
拈花小仙 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-11 23:13:27 | 显示全部楼层
这题好给力。我喜欢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-11-13 22:47:37 | 显示全部楼层
很好的问题,知识点很多:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 07:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表