C 静态数组指针地址

C 静态数组指针地址,c,pointers,C,Pointers,我们有密码 #include <stdio.h> int* aa(int s){ static int ad[2] = {0}; ad[0] = s; printf("aa() -> %p\n", &ad); return ad; } int main(void) { int *k = aa(3); printf("main() -> %p\n", &k); return 0; } 或者我误解了

我们有密码

#include <stdio.h>

int* aa(int s){
    static int ad[2] = {0};
    ad[0] = s;
    printf("aa() -> %p\n", &ad);
    return ad;
}

int main(void) {
    int *k = aa(3);
    printf("main() -> %p\n", &k);
    return 0;
}
或者我误解了或者这个代码有问题


我们为静态数组返回相同的地址,为什么它们在输出上不同?

您编写的printf&k应该是k。因此,您显示了变量k的地址,而不是ad的地址:

#include <stdio.h>

int* aa(int s){
    static int ad[2] = {0};
    ad[0] = s;
    printf("aa() -> %p\n", &ad);
    return ad;
}

int main(void) {
    int *k = aa(3);
    printf("main() -> %p\n", k);
    return 0;
}

你写的printf&k应该是k。因此,您显示了变量k的地址,而不是ad的地址:

#include <stdio.h>

int* aa(int s){
    static int ad[2] = {0};
    ad[0] = s;
    printf("aa() -> %p\n", &ad);
    return ad;
}

int main(void) {
    int *k = aa(3);
    printf("main() -> %p\n", k);
    return 0;
}
主要是打印k指针变量的地址,而不是它所指向的数组的地址。如果您这样做:

printf("main() => %p\n", k);
您将获得与aa中打印的地址相同的地址。

主要是打印k指针变量的地址,而不是它指向的数组的地址。如果您这样做:

printf("main() => %p\n", k);
您将获得与aa中打印的地址相同的地址。

&k返回k的地址,而不是它指向的地址。所以,你得到的是k的地址。您应该将printf更改为

&k返回k的地址,而不是它所指向的地址。所以,你得到的是k的地址。您应该将printf更改为


好的,但从技术上讲,低端地址k不是广告地址吗?所以他们可能是一样的,或者不是?是的,是的。当您将数组作为值返回时,它会自动转换为第一个元素的地址,就像您将它作为参数传递给printf.ok一样,但从技术上讲,低端地址k不是ad的地址吗?所以他们可能是一样的,或者不是?是的,是的。当您将数组作为值返回时,它会自动转换为第一个元素的地址,就像将它作为参数传递给printf一样。