为什么以下代码不会生成错误并打印存储在arr中的值,然后是垃圾值?
int main() {
int arr[1]={10};
printf("%d %d\n",0[arr], 1[arr] );
return 0;
}
答案 0 :(得分:2)
在C中,0[arr] == arr[0]
。
所以,
0[arr]==arr[0]==10.
和
1[arr]==arr[1]==Junk value
选中SO question and it's answers。
C标准将[]运算符定义如下:
a [b] == *(a + b)
因此,[5]将评估为:
*(a + 5)和5 [a]将评估为:
*(5 + a)从小学数学我们知道那些是平等的。 (加法是可交换的。)
这是表示作为指针的数组的直接工件,“a”是一个 内存地址。 “a [5]”是5个元素的值 “一个”。该元素的地址是“a + 5”。这等于偏移量 来自地址空间(5 + a)开头的“5”元素的“a”。
答案 1 :(得分:0)
1[arr]
与arr[1]
相同。
这是可能的,因为根据E1[E2]
运算符的定义,(*((E1) + (E2))
相当于C中的[]
。
请注意,如果您声明:
int arr[1]={10};
数组中只有元素arr[0]
且没有arr[1]
元素。