#include <stdio.h>
#include <stdlib.h>
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” 谢谢。
答案 0 :(得分:10)
确实有效;它只是没有做你认为它做的事。
在foo()
中,a = b
将指针a
更改为指向b
指向的任何内容。它对函数之外的任何东西都没有影响;它只会改变指针。
如果要将a
指向的int的值更改为b
指向的int的值,则需要使用*a = *b
,类似于你已经在函数中进行分配的方式。
答案 1 :(得分:4)
对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;
}
答案 2 :(得分:2)
使用伪内存映射
在main()
,
a b
--------------
| 5 | 6 | <- data
--------------
[1000] [1004] <- address
在函数foo()
中,
a b ( 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()
范围内的最终地图是:
a b
----------------
| 1004 | 1004 | <- data
----------------
[2000] [2004] <- address
答案 3 :(得分:1)
在foo
中,a
和b
是单独的局部变量。将它们设置为具有相同的值对先前的值没有影响 - foo
的最后一行目前基本上没有任何作用。
在foo
内,a
最初是指向与a
中main
相同位置的指针,而b
是指向与main中b
相同位置的指针。最后一行只是使a
中foo
的值与b
相同 - 即指向与main中b
相同位置的指针。所以如果你添加一行
*a = 7;
在foo
的末尾,然后你会看到输出“5,7”。
(顺便说一句,如果您在main
和foo
中使用了不同的变量名,那么您的代码肯定会更容易讨论。)
如果你试图让a
和b
内的main
“别名”,那么你就不会成功。它们是堆栈上的独立局部变量,并将保持不变。无论你做什么,都无法使堆栈“缩小”为别名。
答案 4 :(得分:0)
我不确定你要追求的是什么...如果要让a
和b
包含相同的值,请尝试*a = *b
。
答案 5 :(得分:0)
因为调用foo
时,指针的值被复制到函数中。如果要更改指针本身的值,则需要将指针传递给指向函数的指针。
答案 6 :(得分:0)
a和b是函数foo的本地函数(它们在堆栈中),当程序从堆栈上的函数数据返回时丢失。将b分配给a时,只修改堆栈中的内存地址,而不是它们的值。