数组a[i]与i[a]相等之术

为什么数组值a[1]与数组值1[a]是相等的?为什么会出现这种的奇怪现象?

定义数组a

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

数组a[1] = 1[a]

程序运行的结果是它们相等的。客官别急先看推导。

  • a[1] = *(a+1) 将数组下标取值转换为指针形式取值;
  • *(a+1) = *(1+a) 这个是交换对调位置,也是相等的;
  • *(1+a) = 1[a] 但是最后这个就有点难以明白了,其实这是编译器的问题,在编译器面前,他们都会被解析为取a的首地址+偏移地址所在的内存值。

同理a[i] = i[a]

  • a[i] = *(a+i)
  • *(a+i) = *(i+a)
  • *(i+a) = i[a]

原因

编译器会翻译到数组首地址+偏移地址的方式,所以就支持了该写法,但是一般不会这样用,因为a[i]的方式更加直观。

数组的另类用法

"0123456789abcdef"[value%16]

  • "0123456789abcdef"[0]即为取字符串数组"0123456789abcdef"的首地址'0';
  • 该数组主要的功能为将整型值转换为16进制数;
  • 该数组看起来很怪,但在某些场合上还真使用到,就是一些加密算法(md5)或对性能要求较高的场合,可读性好。

原文发布于微信公众号 - Qt君(qtjuna)

原文发表时间:2018-12-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券