数组名称和数组名称的地址如何打印相同的值?

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)

那么为什么这对数组不起作用呢?

dbu*_*ush 5

与您可能听说过的相反,数组和指针不是一回事。数组是给定类型的一个或多个元素的序列,而指针指向内存位置(可能是数组的第一个元素)。因此,数组的地址与第一个元素的地址相同。

令人困惑的地方在于,在大多数表达式中,数组衰减为指向第一个元素的指针。当数组是 address-of operator 的主题时,这种衰减不会发生的时间之一&

在您的第一段代码中,您首先打印x. 暂时忽略您应该%p用来打印指针而不是%d,这里x会衰减为指向第一个元素的指针,并且该地址就是打印的内容。在下一次调用 时printf,您传入&x。这与x(当转换为指针时)具有相同的值,但具有不同的类型,即x具有 type int [2](衰减为int *)和&x具有 type int (*)[2]

在您的第二个示例中,yis anintpis an int *。这些是单独的变量,因此每个变量都有不同的地址。