Can';我不明白为什么这四个符号是一样的?

Can';我不明白为什么这四个符号是一样的?,c,C,数组声明: int arr [ ]={34, 65, 23, 75, 76, 33}; 四种符号:(考虑i=0) 及 及 及 它们是相同的,因为C语言规范如此规定。阅读它们是相同的,因为C语言规范如此规定。读取数组中的每个元素,在内存中有一个位置。阵列中的位置是连续的。C中的数组是指针,总是指向集合内存中的第一个方向(数组的第一个元素) arr[i]=>获取数组中“i-position”的值。这与arr[i]=*(arr+i) *(arr+i)=>通过添加点arr和i值在内存中的位置来获取内

数组声明:

int arr [ ]={34, 65, 23, 75, 76, 33}; 
四种符号:(考虑i=0)


它们是相同的,因为C语言规范如此规定。阅读

它们是相同的,因为C语言规范如此规定。读取数组中的每个元素,在内存中有一个位置。阵列中的位置是连续的。C中的数组是指针,总是指向集合内存中的第一个方向(数组的第一个元素)

arr[i]=>获取数组中“i-position”的值。这与
arr[i]=*(arr+i)

*(arr+i)=>通过添加点
arr
i值
在内存中的位置来获取内存中的值

*(i+arr)=>与
*(arr+i)
相同。和是可交换的


i[arr]=>与
*(i+arr)
相同。这是另一种表示方式。

数组中的每个元素在内存中都有一个位置。阵列中的位置是连续的。C中的数组是指针,总是指向集合内存中的第一个方向(数组的第一个元素)

arr[i]=>获取数组中“i-position”的值。这与
arr[i]=*(arr+i)

*(arr+i)=>通过添加点
arr
i值
在内存中的位置来获取内存中的值

*(i+arr)=>与
*(arr+i)
相同。和是可交换的


i[arr]=>与
*(i+arr)
相同。这是另一种表示方式。

让我们看看数组在内存中的布局:

low address high address | | v v +----+----+----+----+----+----+ | 34 | 65 | 23 | 75 | 76 | 33 | +----+----+----+----+----+----+ ^ ^ ^ ^ | | | ...etc | | | | | arr[2] | | | arr[1] | arr[0] 低地址高地址 | | v v +----+----+----+----+----+----+ | 34 | 65 | 23 | 75 | 76 | 33 | +----+----+----+----+----+----+ ^ ^ ^ ^ || |…等 | | | || arr[2] | | |arr[1] | arr[0] 第一个元素是
arr[0]
,第二个元素是
arr[1]
,这是每个人都知道的。不太清楚的是,编译器实际上将诸如
arr[i]
之类的表达式转换为
*(arr+i)

*(arr+i)
所做的是首先获取指向第一个元素的指针,然后执行指针算术以在索引
i
处获取指向所需元素的指针,然后取消引用指针以获取其值

由于附加的性质,表达式
*(arr+i)
等于
*(i+arr)
,由于上述翻译,表达式等于
i[arr]


arr[i]
*(arr+i)
的等价性也是数组向指向其第一个元素的指针衰减的原因


指向数组第一个元素的指针将是
&arr[0]
。现在我们知道
arr[0]
应该等于
*(arr+0)
,这意味着
&arr[0]
必须等于
&*(arr+0)
。向任何内容添加零都是不可操作的,因此导致表达式
&*(arr)
。只有一个术语且没有运算符的括号也可以删除,留下
&*arr
。最后,地址和解引用运算符是相互对立的,相互抵消,只剩下
arr
。因此
&arr[0]
等于
arr

让我们看看数组在内存中的布局:

low address high address | | v v +----+----+----+----+----+----+ | 34 | 65 | 23 | 75 | 76 | 33 | +----+----+----+----+----+----+ ^ ^ ^ ^ | | | ...etc | | | | | arr[2] | | | arr[1] | arr[0] 低地址高地址 | | v v +----+----+----+----+----+----+ | 34 | 65 | 23 | 75 | 76 | 33 | +----+----+----+----+----+----+ ^ ^ ^ ^ || |…等 | | | || arr[2] | | |arr[1] | arr[0] 第一个元素是
arr[0]
,第二个元素是
arr[1]
,这是每个人都知道的。不太清楚的是,编译器实际上将诸如
arr[i]
之类的表达式转换为
*(arr+i)

*(arr+i)
所做的是首先获取指向第一个元素的指针,然后执行指针算术以在索引
i
处获取指向所需元素的指针,然后取消引用指针以获取其值

由于加法的性质,表达式
*(arr+i)
等于
*(i+arr)
,由于上述翻译,表达式等于
i[arr]


arr[i]
*(arr+i)
的等价性也是数组向指向其第一个元素的指针衰减的原因


指向数组第一个元素的指针将是
&arr[0]
。现在我们知道
arr[0]
应该等于
*(arr+0)
,这意味着
&arr[0]
必须等于
&*(arr+0)
。向任何内容添加零都是不可操作的,因此导致表达式
&*(arr)
。只有一个术语且没有运算符的括号也可以删除,留下
&*arr
。最后,地址和解引用运算符是相互对立的,相互抵消,只剩下
arr
。因此
&arr[0]
等于
arr
符号
a[i]
*(a+i)
的语法糖

第一个是数学语法(符号更接近人脑所受的教育),而第二个直接对应于一条汇编指令


另一方面,
*(a+i)=*(i+a)=i[a]
,因为符号
a[i]
*(a+i)
的语法糖

第一个是数学语法(符号更接近人脑所受的教育),而第二个直接对应于一条汇编指令

另一方面,
*(a+i)=*(
*(i+arr)
i[arr]
low address high address | | v v +----+----+----+----+----+----+ | 34 | 65 | 23 | 75 | 76 | 33 | +----+----+----+----+----+----+ ^ ^ ^ ^ | | | ...etc | | | | | arr[2] | | | arr[1] | arr[0]