1

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

4

2 回答 2

5

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

int a = 0;

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

int b[8] = {0};

您声明一个对象,大小为 8 个整数,它将占用一些存储空间。你不能改变它的地址,就像你不能改变任何一个 int 的地址一样。

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

sizeof(b) != sizeof(int*)

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

于 2019-06-17T12:29:48.740 回答
0

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

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

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

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

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

于 2019-06-17T13:22:45.850 回答