C如何保证内存地址等于数组值?

时间:2017-05-11 18:33:26

标签: c arrays memory

char str[] = 'hello';
printf("%x, %x", str, &str)

在C中,数组的值和数组的内存地址是相同的。

C如何保证地址可用? 如果被采取会发生什么? 如果有两个具有相同值的数组会怎样?

1 个答案:

答案 0 :(得分:3)

你似乎有一个根本的误解,用这个错误的评论来表达:

  

在C中,数组的值和数组的内存地址是相同的。

数组的值是其元素类型的对象序列。这与其地址并不是一回事。

在存储器中表示这样的值是元素类型的对象的连续表示序列。这样的表示有一个地址。从该表示形式可以看出,它的地址与第一个数组元素的地址相同(在索引0处)。

您可能会产生混淆,因为几乎在每个上下文中都会出现一个数组值或一个指定数组的左值,当被评估时,它被替换(有些人说“衰变到”)指向数组第一个元素的指针。这并不意味着数组值和指针是相同的。另外,在类型方面,替换不是数组的地址,而是元素的地址。这是一个微妙但重要的区别。

这几乎是所有语言都要说的。实现可以提供符合要求的行为,但是他们可以根据自己的需要进行操作。在实践中,实现为数组预留空间作为编译和链接过程的一部分(可能包括动态链接)或作为函数的机器代码的一部分,并且确定地址是什么。在某些情况下,地址将插入到二进制文件中的适当位置(这是链接的一个关键方面)。在其他情况下,地址将存储在内存中并在必要时读取。或者在某些情况下,地址可能仅在阵列的整个生命周期内保存在CPU寄存器中。你不需要关心。