改变数组的基地址

Changing the array's base-address

为什么我不能修改数组的基地址?是因为分配的内存会丢失吗?在那种情况下,我可以使用指针创建一个数组并更改指针指向的内容,分配的内存也会丢失,那有什么区别?

数组本身就是对象,而不是指针。考虑一个更简单的对象:

int a = 0;

您希望能够更改其地址吗?当然不是。对象是具有类型的存储区域。存储区域由其地址标识,因此您不会期望更改它。数组也是对象。当你声明

int b[8] = {0};

你声明一个对象,大小为八个整数,会占用一些存储空间。您无法更改其地址,就像您无法更改任何单个 int 的地址一样。

您可能听说过数组是指针。但他们不是!它们可能会更频繁地转换为指针,甚至是隐式转换,但它们仍然是对象类型。指针通常代表数组,因为第一个元素的地址足以通过指针算法到达任何其他元素,但指针不是数组对象本身。当您检查它们的对象属性时,差异会变得很明显。例如:

sizeof(b) != sizeof(int*)

对象 b 不是指针的大小,实际上它是 8 个整数的大小,可能比指针大。

所有变量的地址都是在编译的不同阶段预先计算好的。

在生成的代码中,您可以看到变量对象被替换为

Static+k for static linkage
Stack+k for automatic linkage
Reg regname
Constant hardcoded

也可以是其他类型的地址。

指针是一个对象,其地址像上面那样预先计算,但其值可以是上面类型的变量。