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