Dil*_*ris 1 c arrays memory-address
考虑以下代码片段。
int main(){
int x[2];
x[0]=100;
x[1]=200;
printf("%d\n",x);
printf("%d\n",&x);
printf("%d\n",*x);
}
Run Code Online (Sandbox Code Playgroud)
输出为(在三行中)
6487616 6487616 100
Run Code Online (Sandbox Code Playgroud)
我读过数组名称是指向数组第一个元素的指针。因此,'x' 的值打印了一个内存地址。但是,如果我尝试打印保存数组第一个元素地址的指针的地址,为什么还会打印相同的内存地址?它不应该打印另一个内存地址,仅仅是因为为了让变量存储内存地址,它应该是一个指针,并且该指针变量在 RAM 中也有一个内存地址。
int main(){
int y = 10;
int *p = &y;
printf("%d\n",&y);
printf("%d\n",&p);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给出的输出为
6487628 6487616
Run Code Online (Sandbox Code Playgroud)
那么为什么这对数组不起作用呢?
与您可能听说过的相反,数组和指针不是一回事。数组是给定类型的一个或多个元素的序列,而指针指向内存位置(可能是数组的第一个元素)。因此,数组的地址与第一个元素的地址相同。
令人困惑的地方在于,在大多数表达式中,数组衰减为指向第一个元素的指针。当数组是 address-of operator 的主题时,这种衰减不会发生的时间之一&
。
在您的第一段代码中,您首先打印x
. 暂时忽略您应该%p
用来打印指针而不是%d
,这里x
会衰减为指向第一个元素的指针,并且该地址就是打印的内容。在下一次调用 时printf
,您传入&x
。这与x
(当转换为指针时)具有相同的值,但具有不同的类型,即x
具有 type int [2]
(衰减为int *
)和&x
具有 type int (*)[2]
。
在您的第二个示例中,y
is anint
和p
is an int *
。这些是单独的变量,因此每个变量都有不同的地址。