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]