This question already has answers here:
Closed 2 years ago.
With arrays, why is it the case that a[5] == 5[a]?
(18个答案)
数组声明:
四个符号:(考虑i=0)
和
和
和
(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
。