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
在foo
, a
和b
是单独的局部变量。 将它们设置为具有相同的值对先前的值没有影响 – foo
的最后一行当前什么都不做。
在foo
, a
最初是指向与main
相同位置的指针, b
是指向与main中b
相同位置的指针。 最后一行只是使b
in的值与b
相同 – 即指向与main中b
相同位置的指针。 所以如果你添加一行
*a = 7;
在foo
结束时,你会看到输出“5,7”。
(顺便说一句,如果你在main
和foo
使用了不同的变量名,你的代码肯定会更容易讨论。)
如果你试图让a
和b
在main
“别名”中相互对话,那么你就不会成功。 它们是堆栈中的独立局部变量,并将保持不变。 无论你做什么,你都不能让堆栈“缩小”为别名。
我不确定你要追求的是什么…如果要让a
和b
包含相同的值,请尝试*a = *b
。
因为当调用foo
时,指针的值被复制到函数中。 如果要更改指针本身的值,则需要将指针传递给指向函数的指针。
当程序从堆栈上的函数数据返回时,a和b是函数foo的本地函数(它们在堆栈中)。 当您将b分配给a时,您只修改堆栈上的内存地址,而不是它们的值。