C指针 – 指向同一地址

#include  #include  void foo(int *a, int *b); void foo(int *a, int *b) { *a = 5; *b = 6; a = b; } int main(void) { int a, b; foo(&a, &b); printf("%d, %d", a, b); return 0; } 

为什么a = b(foo)不起作用? printf输出“5,6”谢谢。

它确实有效; 它只是没有做你认为它做的事情。

foo()a = b将指针a = b更改为指向a = b指向a任何内容。 它对函数之外的任何东西都没有影响; 它只会改变指针。

如果要将a指向的int的值更改为与b指向的int的值相同,则需要使用*a = *b ,类似于已在函数中执行赋值的方式。

foo()的调用以其指向相同地址的局部变量结束,存储在b中 。 此更改不会反映在调用者main()

我喜欢实际执行此操作并使此更改为永久性的,然后您必须将指针传递给指向foo()的指针(因此您可以更改它们),而不是它们的简单值:

 void foo(int **a, int **b) { **a = 5; **b = 6; *a = *b; } 

我刚刚观察到您的代码与该修改不兼容,因为您无法更改两个常规变量以指向彼此。 您还必须以这种方式修改main()

 int main(void) { int a, b; int * ptrA = &a; int * ptrB = &b; foo(&ptrA, &ptrB); printf("%d, %d (%d, %d)", *ptrA, *ptrB, a, b); return 0; } 

使用伪内存映射,

main()

  ab -------------- | 5 | 6 | <- data -------------- [1000] [1004] <- address 

在函数foo()

  ab ( local to foo(), different from the a & b in main() ) ---------------- | 1000 | 1004 | <- data ---------------- [2000] [2004] <- address 

那么,当在foo()的范围内时,

 *a = 5; // store 5 in int variable a *b = 6; // store 6 in int variable b a = b; // copies contents of pointer variable b to a 

所以foo()范围内的最终地图是:

  ab ---------------- | 1004 | 1004 | <- data ---------------- [2000] [2004] <- address 

fooab是单独的局部变量。 将它们设置为具有相同的值对先前的值没有影响 – foo的最后一行当前什么都不做。

fooa 最初是指向与main相同位置的指针, b是指向与main中b相同位置的指针。 最后一行只是使b in的值与b相同 – 即指向与main中b相同位置的指针。 所以如果你添加一行

 *a = 7; 

foo结束时,你会看到输出“5,7”。

(顺便说一句,如果你在mainfoo使用了不同的变量名,你的代码肯定会更容易讨论。)

如果你试图让abmain “别名”中相互对话,那么你就不会成功。 它们是堆栈中的独立局部变量,并将保持不变。 无论你做什么,你都不能让堆栈“缩小”为别名。

我不确定你要追求的是什么…如果要让ab包含相同的值,请尝试*a = *b

因为当调用foo时,指针的值被复制到函数中。 如果要更改指针本身的值,则需要将指针传递给指向函数的指针。

当程序从堆栈上的函数数据返回时,a和b是函数foo的本地函数(它们在堆栈中)。 当您将b分配给a时,您只修改堆栈上的内存地址,而不是它们的值。