更改数组的基地址

时间:2019-06-17 12:19:40

标签: c arrays pointers memory base-address

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

2 个答案:

答案 0 :(得分:5)

数组是全部独立的对象,而不是指针。考虑一个更简单的对象:

int a = 0;

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

int b[8] = {0};

您声明一个对象,该对象的大小为8个整数,将占用一些存储空间。您不能更改其地址,而只能更改任何单个int的地址。

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

sizeof(b) != sizeof(int*)

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

答案 1 :(得分:0)

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

在生成的代码中,您可以看到

替换了一个变量对象。
Static+k for static linkage
Stack+k for automatic linkage
Reg regname
Constant hardcoded

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

指针是一个对象,其地址如上所述进行了预先计算,但是其值可以是上面类型的变量。