<分区>
当你声明一个数组时我明白了,例如:
int Numbers[5];
int *intPtr = NULL;
您不能执行以下操作:
Numbers++;
Numbers + 1 = intPtr;
Numbers = NULL;
etc
使数组的基地址(和后续地址)成为常量(或不可修改的?)的动机是什么?假设出于某些奇怪的原因,我想这样做:
Numbers + 8 = intPtr;
为什么编译器不允许访问超过分配的整数数量(在本例中为 5)?
<分区>
当你声明一个数组时我明白了,例如:
int Numbers[5];
int *intPtr = NULL;
您不能执行以下操作:
Numbers++;
Numbers + 1 = intPtr;
Numbers = NULL;
etc
使数组的基地址(和后续地址)成为常量(或不可修改的?)的动机是什么?假设出于某些奇怪的原因,我想这样做:
Numbers + 8 = intPtr;
为什么编译器不允许访问超过分配的整数数量(在本例中为 5)?
最佳答案
如果是
int Numbers[5];
您没有定义指针。您正在定义一个数组。实际上,Numbers
的类型是 int[5]
。你正在定义的那个数组,它在内存中的某处有一个位置。该内存的 base 由 (int *)Numbers
指向。由于内存不能移动到任何地方,移动 (int *)Numbers
也是非法的。
请注意,内存位置 的这种不变性并不局限于数组。例如:
int x;
现在,您将如何在内存中移动 x
?如果您执行 x++
,则会增加 x
,但不会移动它。并且尝试使用指向 x
的指针进行任何数学运算肯定不会在内存中移动 x
。 x
(或Numbers
)在内存中的位置是在创建 x
时设置的,无论您如何努力都无法移动它.这适用于任何类型——您不能移动单个整数,也不能移动数组。
关于从概念上讲,为什么数组地址不可修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18079983/