【发布时间】:2021-01-25 17:24:44
【问题描述】:
我了解到数组的值是按照内存地址“并排”存储的,因此数组的名称是指向数组第一个值的指针:
#include <stdio.h>
int main() {
int array[] = {1, 2, 3};
printf("%d", *array); // The first value of array: 1
printf("%d", *(array + 1)); // The second value of array: 2
}
直觉上,我认为代码中一个又一个声明的变量只是简单地分配了相邻的内存地址。这个想法违背了数组在内存中的定义方式,因为我的代码中的所有变量都会组成一个大数组。
我的问题是,本质上,有没有办法知道一个变量的地址是什么,相对于我程序中定义的其他变量,而不是打印它的地址?
【问题讨论】:
-
您使用的是数组,因此数组的所有元素在内存中都是连续的。但是,使用(例如):
int main(void) { int a,b,c; },它们可以按任何顺序排列,甚至可以不连续。 -
它与数组有关。在 C/C++ 中,可以保证数组中的元素在内存中是连续的。分配块的字节也将是连续的。没有其他保证。地址所在的位置还取决于类型或限定类型。具有自动存储持续时间的对象在程序堆栈上声明。
static或global对象与具有已分配存储持续时间的对象一样存储在其他位置。 -
这更多的是关于行为编译器和运行时,而不是语言,因为它们的行为在不断变化,所以没有明确的答案。该语言只是告诉您不应该关心(例如,不允许计算不属于同一数组或结构的变量的地址差异)。
-
关于“这个想法违背了数组在内存中的定义方式,因为我的代码中的所有变量都会组成一个大数组”:这是一个不合逻辑的。数组元素在内存中相邻的事实并不意味着其他事物在内存中可能不再相邻,就像我把我的房子涂成白色的事实意味着你可能不会把你的房子涂成白色一样。
标签: c pointers memory-address