This question already has answers here:
Closed 2 years ago.
With arrays, why is it the case that a[5] == 5[a]?
(18个答案)
数组声明:
int arr [ ]={34, 65, 23, 75, 76, 33};

四个符号:(考虑i=0)
arr[i]


*(arr+i)


*(i+arr)


i[arr]

最佳答案

让我们看看数组在内存中的布局:
低地址高地址
| |

+----+----+----+----+----+----+
|34 | 65 | 23 | 75 | 76 | 33|
+----+----+----+----+----+----+
^ ^ ^ ^
|| |……等
| | |
|| arr[2]
| |
|阿瑞[1]
|
arr[0]
第一个元素是arr[0],第二个元素是非常清楚的,这是每个人都学到的不太清楚的是,编译器实际上将arr[1]这样的表达式转换为arr[i]
*(arr + i)所做的是首先获取指向第一个元素的指针,然后执行指针运算以获取指向索引*(arr + i)处所需元素的指针,然后取消对指针的引用以获取其值。
由于加法的commutative性质,表达式i等于*(arr + i),而由于上述翻译,表达式*(i + arr)等于i[arr]
arr[i]*(arr + i)的等价性也是数组衰减为指向其第一个元素的指针的原因。
指向数组第一个元素的指针将是&arr[0]现在我们知道arr[0]应该等于*(arr + 0)这意味着&arr[0]必须等于&*(arr + 0)对任何东西加零都是不运算,因此导致表达式&*(arr)也可以删除只有一个术语且没有运算符的括号,只留下&*arr最后,address of和dereference操作符是彼此对立的,并且彼此抵消,只剩下arr所以&arr[0]等于arr

09-30 15:52
查看更多