免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 18091 | 回复: 65
打印 上一主题 下一主题

二维数组指针,编译器到底为我们处理了多少 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-15 12:03 |只看该作者 |倒序浏览
学了这么多年C 自认为对指针有一定了解。回过头来看教材,又发现蒙了。
这是关于二维数组指针的,希望谁明白能给讲清楚。
看测试程序:

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.         int a[2][2]={1,2,3,4};
  5.         printf("a=%u\n", (unsigned int)a);
  6.         printf("*a=%u\n", (unsigned int)(*a));
  7.         printf("**a=%u\n", (unsigned int)(**a));
  8.         printf("a+1=%u\n", (unsigned int)(a+1));
  9.         printf("*(a+1)=%u\n", (unsigned int)(*(a+1)));
  10. }

复制代码
执行结果:
a=3216495792
*a=3216495792
**a=1
a+1=3216495800
*(a+1)=3216495800
看这里。 a是一个地址吧, *a是这个地址指向的位置。 我们发现 a值等于*a值。就是说一个地址里的值还为这个地址。 如果这样的话 *a **a  ***a  (n个*)a 都还该为这个值。
可是第三行输出明显否定了这个推论。 到底是怎么回事呢??

论坛徽章:
0
2 [报告]
发表于 2011-03-15 12:08 |只看该作者
a和*a地址相同,类型不同,顺便说下&a转换成uint32_t也是那个值。
类型不同,就代表这是两个不同的东西。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2011-03-15 12:08 |只看该作者
二维数组,a[0]这个地址就是a的地址呀

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
4 [报告]
发表于 2011-03-15 12:09 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2011-03-15 12:53 |只看该作者
回复 2# davelv


    好像也没有说清楚, 类型是确定从这个地址取值时的长度为多少,还有指针做加减运算的偏移量多少 (p+2) 可这里取值似乎和类型没什么关系。2楼有真正想过二位数租时这些地址和值处理时之间的对应关系吗?

论坛徽章:
0
6 [报告]
发表于 2011-03-15 12:55 |只看该作者
回复 4# c/unix


    4楼这种说法是在哪里都可以看到的。如果看这几句话就懂了我不会在chinaunix这里发贴了。

论坛徽章:
0
7 [报告]
发表于 2011-03-15 13:01 |只看该作者
回复  c/unix


    4楼这种说法是在哪里都可以看到的。如果看这几句话就懂了我不会在chinaunix这里发贴 ...
mickgrady 发表于 2011-03-15 12:55



    4楼说的很清楚啊,有什么不能理解的?

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
8 [报告]
发表于 2011-03-15 13:06 |只看该作者
如果看不懂4楼的话,你应该重新学习C语言了....

论坛徽章:
0
9 [报告]
发表于 2011-03-15 13:10 |只看该作者
回复  davelv


    好像也没有说清楚, 类型是确定从这个地址取值时的长度为多少,还有指针做加减运算 ...
mickgrady 发表于 2011-03-15 12:53


难道对*运算(解引用)没有影响么;

例如
int a = 0x65666768;
*(short *)(&a) ==?
*(char *)(&a) ==?

论坛徽章:
0
10 [报告]
发表于 2011-03-15 13:13 |只看该作者
这里绝对有些说法, 为什么  a 和 *a的值一样。这我们熟知的指针和引用一样吗  不要把大家知道的现象做为解释啊。 4楼那种是说法我一直是这么记的, 也是这么用的。用到现在仔细想想理解不了。
说类型不同也算尝试着解释,不过最起码我是没看出什么逻辑关系。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP