XGuru's Blog

技术,是一种态度。关注:高性能后端技术/服务器架构/C++/C/LAMP

   :: 首页 :: 联系 :: 聚合  :: 管理
  20 Posts :: 0 Stories :: 93 Comments :: 0 Trackbacks

公告





twitter / xoXGuru

feedsky
抓虾
google reader
鲜果
QQ邮箱
九点

常用链接

留言簿(12)

搜索

  •  

最新评论

阅读排行榜

 

大家对数组的使用再熟悉不过了吧?
来看下这个程序,挺简单的。

1#include<iostream>
2int main()
3{
4    int a[] = {1,2,3,4,5};
5    for(int i = 0 ; i < 5; i++)
6        std::cout << i[a] << " ";
7    return 0;
8}


现在请仔细看第6行。
发现了什么?
试下编译一下看能不能通过?


把这个程序更加简化

1int a[5= {1,2,3,4,5};
2int b = 1[a];

 
再来看下产生的汇编代码
4:       int a[5] = {1,2,3,4,5};
00401568   mov         dword ptr [ebp-14h],1
0040156F   mov         dword ptr [ebp-10h],2
00401576   mov         dword ptr [ebp-0Ch],3
0040157D   mov         dword ptr [ebp-8],4
00401584   mov         dword ptr [ebp-4],5
5:        int b = 1[a];
0040158B   mov         eax,dword ptr [ebp-10h]
0040158E   mov         dword ptr [ebp-18h],eax

你没有看错,此刻这个数组春哥附体,a[1]的指向地址和1[a]是一样的,都是[ebp-10h]。

Why?

我们回忆一下数组和指针的关系,如何用指针来表示数组?
*a  就是 数组 a中下标为0的值的引用,即a[0],
那么*(a+i) 呢?
表示的就应该是数组 a中下标为i的值的引用了,即a[i],
那么这种现象也不足为怪了:
因为 *(a+i)  == *(i+a)
所以 a[i] == i[a]

是不是感到 啊哈!灵机一动(aha! Insight)了呢?

扩展资料:《C陷阱与缺陷》p33~p38




posted on 2009-12-24 00:55 XGuru 阅读(2127) 评论(14)  编辑 收藏 引用

Feedback

# re: C/C++数组的一个“怪现象” 2009-12-24 12:21 t
搞c++的都懂点数组/地址间的关系 所以应该没啥奇怪的

真正奇怪的是, 这样的写法是不是标准c++. 我觉得[]前的应该是变量名字,而1应该不符合变量命名(数字不能开头).  回复  更多评论
  

# re: C/C++数组的一个“怪现象” 2009-12-24 12:24 凡客成品
路过踩踩!!  回复  更多评论
  

# re: C/C++数组的一个“怪现象” 2009-12-24 13:12 Ted
@t
其实不难想象,你所奇怪的不是已经被自己一语道破了吗~
数组也是地址,因此实际上1[a]这样的语句被编译器理解为"取基址1加上偏移量a的内存块的内容".  回复  更多评论
  

# re: C/C++数组的一个“怪现象” 2009-12-24 14:16 izualzhy
学习了呵呵  回复  更多评论
  

# re: C/C++数组的一个“怪现象” 2009-12-24 16:43 guest
是古老的C语法。。很少人用了。  回复  更多评论
  

# re: C/C++数组的一个“怪现象”[未登录] 2009-12-24 19:25 cawboy
新手,以前没见过  回复  更多评论
  

# re: C/C++数组的一个“怪现象” 2009-12-24 22:15 cdy20
偶赞!  回复  更多评论
  

# re: C/C++数组的一个“怪现象” 2009-12-24 22:38 Sunshine Alike
我灵光一闪~~哈哈  回复  更多评论
  

# re: C/C++数组的一个“怪现象” 2009-12-25 12:16 float
都是地址相加,数组名是一个常量指针。
LZ可以试下

"abcdef"[0];
这样也是正确的

:)
  回复  更多评论
  

# re: C/C++数组的一个“怪现象” 2009-12-25 16:07 凡客诚品官方网站
是古老的C语法。。  回复  更多评论
  

# re: C/C++数组的一个“怪现象” 2009-12-26 11:49 Geek.tan
“此刻春哥附体了”--哈哈  回复  更多评论
  

# re: C/C++数组的一个“怪现象”[未登录] 2009-12-28 18:00 欲三更
加法满足交换律  回复  更多评论
  

# re: C/C++数组的一个“怪现象” 2009-12-29 09:17 junglevass
古老的c语法,别用了。。。。第一次见都会觉得奇怪。  回复  更多评论
  

# re: C/C++数组的一个“怪现象” 2009-12-31 15:14 zsslxy2006
在《C专家》或《C&指针》里有讲过这种。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理