0

我正在尝试了解 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 (& 运算符)。

4

9 回答 9

8

main中,您正在打印 and 的地址xy但在 中foo,您正在打印指向 and 的指针的地址。你的意思是写:xy

printf("x = %p\ny = %p\n", x, y);

(注意缺少&beforexy

于 2010-09-28T16:54:03.480 回答
3

因为printf("x = %p\ny = %p\n", &x, &y);打印 x 和 y 的地址,而不是它们的值。您需要将其替换为

printf("x = %p\ny = %p\n", x, y);

产生相同的结果。

于 2010-09-28T16:53:27.127 回答
3

您的 foo 函数将指向 int 的指针作为参数,这意味着 x 和 y 已经是 foo 中的指针,它们的值是您要打印的地址。

相反,您打印这些指针的地址。你的打印应该看起来更像

printf("x = %p\ny = %p\n", x, y);
于 2010-09-28T16:53:51.807 回答
3

printf调用被传递指针的foo地址,即类型变量int **。如果您&从调用中删除符号,您应该得到与调用中printf相同的地址。printfmain

于 2010-09-28T16:54:20.823 回答
2

首先,关于你的 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);

从上面的内存映射中可以清楚地看出。

于 2010-09-28T17:04:43.280 回答
1

主要是打印局部变量ab. 在foo您打印局部变量的地址时,xy不是其中保留的地址。如果您希望它们匹配&,则需要插入。foo

请记住,指针是一个保存内存地址的变量。您将指针变量的地址与指针中保留的地址混淆了。如果您希望两个打印匹配,您需要打印指针持有的内容。

于 2010-09-28T16:55:30.807 回答
1

在 main 中,您正在打印 a 和 b 变量的地址。但在函数 foo() 中,您正在打印指向 x 和 y 的指针的地址

于 2015-08-13T07:59:47.960 回答
0

main() 中的第一个printf显示 maina和的地址b

fooprintf显示 和 的x地址y

我猜你想要的是显示来自 main() 的地址ab

更改 foo:

  printf("x = %p\ny = %p\n", x, y);

显示来自 main() 的地址

于 2010-09-28T16:55:00.010 回答
0

主要打印变量 a 和 b 的地址。在函数 foo() 中,指针 x 和 y 的外观被打印出来,它们分别指向变量和 b。

于 2020-05-11T03:01:42.737 回答