C指针 - 不同的地址

问题描述 投票:0回答:9

我想学习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)。

c pointers memory-address
9个回答
8
投票

main你要打印的地址是 xy但在 foo你要打印的地址是 指针xy. 你 意思 来写。

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

(请注意,没有... & 之前 xy)


3
投票

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

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

产生同样的结果。


3
投票

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

相反,你应该打印这些指针的地址。

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

3
投票

printf 召见 foo 正在传递指针的地址,即类型为 int **. 如果你删除了 & 符号 printf 呼叫你应该会得到相同的地址,就像从 printf 召见 main.


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);

从上面的内存图可以看出。


1
投票

在main中,你打印的是局部变量的地址。ab. 在 foo 您正在打印局部变量的地址。xy而不是保留在其中的地址。您需要删除 &foo 如果你想让它们匹配。

请记住,指针是一个保存内存地址的变量。你混淆了指针变量的地址和指针中保留的地址。如果你想让这两个打印结果匹配,你需要打印指针所保留的内容。


1
投票

在main中,你打印的是a & b变量的地址......但在函数foo()中,你打印的是x & y的指针的地址。


0
投票

第一个 printf 的地址,显示main的 ab.

傅氏 printf 显示地址的 xy.

我想,你想要的是显示来自main()的 ab

将foo.改成显示来自main()的地址。

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

显示来自main()的地址。


0
投票

在main中,打印了变量a和b的地址。在函数foo()中,打印了指针x和y的衣服,这些指针指向变量和b。

© www.soinside.com 2019 - 2024. All rights reserved.