| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 949 人关注过本帖
标题:O(∩_∩)O哈哈~ 编译器笑了 我哭了
只看楼主 加入收藏
zh77
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:84
专家分:22
注 册:2011-8-5
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:20 
O(∩_∩)O哈哈~ 编译器笑了 我哭了
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册



这个我觉得没错  我师父说还需要验证  向大家求解   我认为 那5个值相等 不管大家观点怎木样   大家给个有力的解释  !!!
Thank you very much!!!!
搜索更多相关主题的帖子: 编译器 Thank 
2011-08-21 01:10
dreamofgod
Rank: 5Rank: 5
等 级:职业侠客
帖 子:194
专家分:341
注 册:2011-8-16
收藏
得分:0 
你怎么就编译通过了呢……我VC6报错啊

一个单片机就让我头疼不已~~~
2011-08-21 08:46
zhcosin
Rank: 2
等 级:论坛游民
帖 子:29
专家分:77
注 册:2011-8-18
收藏
得分:0 
在二维数组里,这5个的确相等,C语言中的数组是顺序存储的,用一片连续的地址依次存放各数组元素的值。
一维数组:假设arr[10]是一个一维数组,那么数组名arr代表数组的起始地址,也就是arr[0]的地址,程序可以根据起始地址计算出任何一个数组的元素相对于起始地址的偏移量,例如第8个元素arr[8]的地址就是arr+8,所以arr[8]=*(arr+8),而且系统内部也确实是这样来处理的。
二维数组:假设arr[10][10]是一个二维数组,数组名仍然代表数组的起始地址。二维数组arr[10][10]可以看作一个一维数组,其每个数组元素又是一个一维数组,比如说:这里arr[0]其实可以看作一个一维数组,其元素从arr[0][0]到arr[0][9],arr[1]又可看作一维数组,其元素从arr[1][0]到arr[1][9],既然arr[0]、arr[1]……arr[9]这些都可看作一维数组,而一维数组的名称就代表数组的起始地址,所以arr[0]是第一行的起始地址,arr[1]是第二行的起始地址,arr[9]是最后一行的起始地址,因此a[i]就是第i-1行的地址,也是a[i][0]的地址,即a[i]=&a[i][0],而a[i]=*(a+i)仍然是成立的。
总结一下:二维数组中,a[i]代表第i-1行这个一维数组,因而a[i][j]的地址是a[i]+j,所以a[i][j]=*(a[i]+j)=*(*(a+i)+j)
2011-08-21 08:50
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:0 
楼主的程序我这里报错。不过这五个地址的确相等
int a[2][2]={1,2,3,4};
printf("%d\n%d\n%d\n%d\n%d\n",a+1,a[1],*(a+1),&a[1][0],&a[1]);

2011-08-21 09:05
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:5 
确实相等,在ubuntu下面用gcc编译的程序也是这个结果,把地址打印出来也是相等的。这里面有个理解起来困难点就是a[1]和&a[1]怎么是相等的。不过,只要转换一下:&a[1]=&*(a+1)=a+1。由于a+1和*(a+1)是数值上相等的,因此也相等了。但是,数值上相等,不代表两者的实际意义一样。a+1是一个指向2个整型元素的指针,而*(a+1)是指向单个整型元素的指针,恰好指向的地址相同。
a+1,*(a+1),a[1],&a[1],&a[1][0]:0xbfbc5648,0xbfbc5648,0xbfbc5648,0xbfbc5648,0xbfbc5648


[ 本帖最后由 pauljames 于 2011-8-21 09:21 编辑 ]

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-08-21 09:16
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:0 
它们的值是相等的,但是类型有的不同,所以有些不能成为相等关系,这也是VC报错的原因。以上四个当中,&a[1][0],a[1],*(a+1)是相等的,a+1与&a[1]是相等的。

A real warrior never quits.
2011-08-21 09:51
MM学不好C
Rank: 1
等 级:新手上路
帖 子:19
专家分:7
注 册:2011-7-22
收藏
得分:0 
你师傅是蠢驴吗?
2011-08-21 10:28
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
汗一下
还以为是怎么笑滴哇
2011-08-21 10:41
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
这种东西嘛,要解释就要看编译器的源码了~
2011-08-21 11:45
zh77
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:84
专家分:22
注 册:2011-8-5
收藏
得分:0 
回复 2楼 dreamofgod
你看好别打错啊
2011-08-21 17:38
快速回复:O(∩_∩)O哈哈~ 编译器笑了 我哭了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018590 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved