从概念上讲,为什么数组地址不可修改?

标签 c arrays pointers

<分区>

当你声明一个数组时我明白了,例如:

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 的指针进行任何数学运算肯定不会在内存中移动 xx(或Numbers)在内存中的位置是在创建 x 时设置的,无论您如何努力都无法移动它.这适用于任何类型——您不能移动单个整数,也不能移动数组。

关于从概念上讲,为什么数组地址不可修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18079983/

相关文章:

java - 从字节数组获取像素值

C - 通过 strcpy 打印 char* 行为是否矛盾?

C 在释放内存时将 double 类型的变量转换为 char 类型的变量

c - 为什么在 C 中自动变量分配在堆栈内存中而不是堆内存中?

Windows 中的 copymemory() 问题

Javascript:找出数组中是否至少有两个不同的值

c++ - 通过引用传递 std::string 数组

c++ - 指向对象和继承对象的指针数组

你能把一个没有方括号或下标的数组加到一个整数上吗?结果是什么?

c - 使用 strdup 进入 malloc 保留空间