【问题标题】:C pointers - Different addressC 指针 - 不同的地址
【发布时间】:2010-09-28 16:49:46
【问题描述】:

我正在尝试学习 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(main)输出两个地址。另一个printf (foo) 输出不同的地址。我将地址传递给 foo(& 运算符)。

【问题讨论】:

    标签: c pointers memory-address


    【解决方案1】:

    main 中,您正在打印xy 的地址,但在foo 中,您正在打印指向xy指针 地址.你打算写:

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

    (注意xy之前缺少&amp;

    【讨论】:

      【解决方案2】:

      因为printf("x = %p\ny = %p\n", &amp;x, &amp;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);
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              【解决方案6】:

              在 main 中,您正在打印局部变量 ab 的地址。在foo 中,您打印的是局部变量xy 的地址,而不是其中保留的地址。如果您希望它们匹配,则需要将 &amp; 删除到 foo 中。

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

              【讨论】:

                【解决方案7】:

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

                【讨论】:

                  【解决方案8】:

                  main() 中的第一个printf 显示main 的ab 的地址。

                  foo 的printf 显示xy 的地址。

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

                  更改 foo:

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

                  显示来自 main() 的地址

                  【讨论】:

                    【解决方案9】:

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2019-09-07
                      • 2020-07-06
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多