两个指针反映相同的值但具有不同的地址(C语言)

Twos pointers reflects the same value but with different address( C language)

我创建了一个指向 return 指针的函数,如下所示:

int* function(int cc){
    int* p;
    p=&cc; 
    return p;
}

int main(){
    int a;
    int *p1;
    a=10;
    p1=&a;
    printf("value for *p1 = %d\r\n",*p1);
    printf("value for *function  %d\r\n", *function(a));
    printf("pointer p1 = %p\r\n", p1);
    printf("pointer function= %p\r\n", function(a));

    return 0;
}

控制台日志如下:

value for *p1 = 10
value for *function  10
pointer p1 = 0x16d4bb1f8
pointer function= 0x16d4bb1dc

我真的不明白为什么两个指针可以显示相同的值,但它们存储的地址却不同。

您在函数中传递的变量作为参数完成(普通变量而不是指针)。如果你真的想要它应该像你期望的那样工作,那么你应该传递指针而不是普通的 int 局部变量。

进行这些更改:

int* function(int *cc){
    int* p;
    p=cc; 
    return p;
}

int main(){
    int a;
    int *p1;
    a=10;
    p1=&a;
    printf("value for *p1 = %d\r\n",*p1);
    printf("value for *function  %d\r\n", *function(&a));
    printf("pointer p1 = %p\r\n", p1);
    printf("pointer function= %p\r\n", function(&a));

    return 0;
}

此代码有效并显示了您期望的输出...我们这样做是因为我们不希望将变量的新副本传递到函数中。我们想要相同的地址,所以我们应该在函数中传递变量地址。

这样做

void function(int cc){
    int* p;
    p=&cc; 
   cc = 42; // just for fun
   printf("value of cc inside function  %d\r\n", cc);
  printf("value of &cc %p\r\n", &cc);
}

int main(){
    int a;
    int *p1;
    a=10;
    p1=&a;
    function(a);
    printf("value for *p1 = %d\r\n",*p1);
    printf("pointer p1 = %p\r\n", p1);
    return 0;
}

你会看到 cc 是 a 的副本,如果你在 'function' 中改变它的值它不会改变 'a'。你发现了 c 的 'call by value' 语义。这意味着变量作为副本传递给函数。