C中的函数参数是否始终具有相同的内存地址?

ins*_*ese 6 c parameters pointers function

好的,所以C是按值传递,这意味着使用变量的副本而不是参数的原始变量,对吧?那么,该副本是否总是具有相同的内存地址?考虑以下代码:

void test(int *ptr) {   
    printf("&ptr: %p\n", &ptr);
    printf("ptr: %p\n", ptr);
    printf("*ptr: %d\n\n", *ptr);
}

int main() {
    int a = 1, b = 2, c = 3, d = 4, e = 5;
    test(&a);
    test(&b);
    test(&c);
    test(&d);
    test(&e);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我从这段代码得到的输出是这样的:

&ptr: 0x7fff70536728
ptr: 0x7fff7053674c
*ptr: 1

&ptr: 0x7fff70536728
ptr: 0x7fff70536750
*ptr: 2

&ptr: 0x7fff70536728
ptr: 0x7fff70536754
*ptr: 3

&ptr: 0x7fff70536728
ptr: 0x7fff70536758
*ptr: 4

&ptr: 0x7fff70536728
ptr: 0x7fff7053675c
*ptr: 5
Run Code Online (Sandbox Code Playgroud)

我的直觉是"不".据我所知,ptr代码块之外不存在test().那么,为什么&ptr所有五个函数调用都是一样的呢?

Cro*_*man 6

&ptr是相同的因为ptr是一个局部变量test().由于你test()连续五次调用而没有任何干预,所以每次调用它时都会在堆栈上给出相同的地址(注意,这不是C所要求的 - 它只是你的机器在做什么,以及它通常会如何发生).

如果你调用了自己调用的第二个函数,则test()不会得到相同的输出&ptr,因为ptr之前驻留的堆栈上的空间现在正由插入函数调用使用.

例如:

#include <stdio.h>

void test(int *ptr) {
    printf("&ptr: %p\n", (void *) &ptr);
    printf("ptr: %p\n", (void *) ptr);
    printf("*ptr: %d\n\n", *ptr);
}

void test_test(void) {
    int a = 1;
    test(&a);
}

int main() {
    int a = 1, b = 2, c = 3, d = 4, e = 5;

    test(&a);
    test(&b);
    test(&c);
    test(&d);
    test(&e);
    test_test();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

收益率:

paul@local:~/src/c/scratch$ ./ptrtest
&ptr: 0x7fff39f79068
ptr: 0x7fff39f7909c
*ptr: 1

&ptr: 0x7fff39f79068
ptr: 0x7fff39f79098
*ptr: 2

&ptr: 0x7fff39f79068
ptr: 0x7fff39f79094
*ptr: 3

&ptr: 0x7fff39f79068
ptr: 0x7fff39f79090
*ptr: 4

&ptr: 0x7fff39f79068
ptr: 0x7fff39f7908c
*ptr: 5

&ptr: 0x7fff39f79048
ptr: 0x7fff39f7906c
*ptr: 1

paul@local:~/src/c/scratch$
Run Code Online (Sandbox Code Playgroud)

并且你可以看到&ptr在最后一次通话中有所不同,这是通过test_test().