我想学习C指针,但我不明白一些事情......下面的代码。
#include <stdio.h>
void foo(int *x, int *y);
void foo(int *x, int *y) {
printf("x = %p\ny = %p\n", &x, &y);
*x = 5;
*y = 6;
}
int main(void) {
int a, b;
printf("a = %p\nb = %p\n", &a, &b);
foo(&a, &b);
return 0;
}
为什么两个地址不一样?第一个 printf
主)输出两个地址。printf
(foo)输出不同的地址。我把地址传给foo(& operator)。
在 main
你要打印的地址是 x
和 y
但在 foo
你要打印的地址是 指针 到 x
和 y
. 你 意思 来写。
printf("x = %p\ny = %p\n", x, y);
(请注意,没有... &
之前 x
和 y
)
因为 printf("x = %p\ny = %p\n", &x, &y);
打印x和y的地址,而不是它们的值。你需要用
printf("x = %p\ny = %p\n", x, y);
产生同样的结果。
你的foo函数以int的指针作为参数,这意味着x和y已经是foo中的指针,它们的值就是你要打印的地址。
相反,你应该打印这些指针的地址。
printf("x = %p\ny = %p\n", x, y);
该 printf
召见 foo
正在传递指针的地址,即类型为 int **
. 如果你删除了 &
符号 printf
呼叫你应该会得到相同的地址,就像从 printf
召见 main
.
首先,关于你的C语言。
如果你在main()上面定义了整个函数,你就不需要在它前面包含它的原型,所以删除第二行。
void foo(int *x, int *y);
现在,对于真正的问题来说,一个伪内存映射会很方便。
a b
--------------
| 5 | 6 | <- data
--------------
[1000] [1004] <- address
x y
----------------
| 1000 | 1004 | <- data
----------------
[2000] [2004] <- address
所以在这里,你会得到:
a = 1000 b = 1004 (the addresses of a & b)
x = 2000 y = 2004 (the addresses of x & y)
如果你想:
x = 1000 y = 1004
类型:
printf("x = %p\ny = %p\n", x, y);
从上面的内存图可以看出。
在main中,你打印的是局部变量的地址。a
和 b
. 在 foo
您正在打印局部变量的地址。x
和 y
而不是保留在其中的地址。您需要删除 &
在 foo
如果你想让它们匹配。
请记住,指针是一个保存内存地址的变量。你混淆了指针变量的地址和指针中保留的地址。如果你想让这两个打印结果匹配,你需要打印指针所保留的内容。
在main中,你打印的是a & b变量的地址......但在函数foo()中,你打印的是x & y的指针的地址。
第一个 printf
的地址,显示main的 a
和 b
.
傅氏 printf
显示地址的 x
和 y
.
我想,你想要的是显示来自main()的 a
和 b
将foo.改成显示来自main()的地址。
printf("x = %p\ny = %p\n", x, y);
显示来自main()的地址。
在main中,打印了变量a和b的地址。在函数foo()中,打印了指针x和y的衣服,这些指针指向变量和b。