数组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)或对性能要求较高的场合,可读性好。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值