【问题标题】:C++ difference between %p and cout &ptr%p 和 cout &ptr 之间的 C++ 区别
【发布时间】:2016-01-06 22:47:33
【问题描述】:

所以我有一段代码需要打印一个数字的地址和一个ptr的地址。 这是代码:

int main() {
    float number1 = 1;
    float number2;

    float *fPtr;
    fPtr = &number1;
    cout << "Value of object pointed to by fPtr: " << *fPtr << endl;

    cout << "Value of number 2: " << number2 << endl;

    cout << "Address of number 1: " << &number1 << endl;
    printf("%p\n", &number1);
    cout << "Address fPtr: " << &fPtr << endl;
    printf("%p", fPtr);


    return 0;
}

输出是:

fPtr 指向的对象的值:1

数字 2 的值:0

1号地址:0xbfb7e348

0xbfb7e348

地址 fPtr: 0xbfb7e34c

0xbfb7e348

为什么使用 %p 转换说明符打印的两个地址相同?当使用 & 时,地址是不同的,这是我所期望的,因为 number1 和 fPtr 保存在不同的地址中。

此外,我从语句 'printf("%p\n", &number1);' 中删除了 &返回值为零。谁能解释一下原因?

【问题讨论】:

    标签: c++ pointers printf cout


    【解决方案1】:

    在这里,您正在打印fPtr地址

    cout << "Address fPtr: " << &fPtr << endl;
    

    在这里,您正在打印fPtr

    printf("%p", fPtr);
    

    这些不是一回事。

    如果你想用printf打印fPtr的地址,那么你需要

    printf("%p", &fPtr);
    

    如果你想用std::cout打印fPtr的值,那么你需要

    cout << fPtr << endl;
    

    【讨论】:

      【解决方案2】:

      代码似乎缺少 printf 行中 fPtr 之前的 &。尝试更改为:

      printf("%p", &fPtr);
      

      【讨论】:

        【解决方案3】:

        为什么使用 %p 转换说明符打印的两个地址相同?

        嗯,你有

        fPtr = &number1;
        
        // ...
        
        printf("%p\n", &number1);
        
        // ...
        
        printf("%p", fPtr);
        

        如果两个printf() 调用确实打印相同的东西,那将是相当令人惊讶的,因为它们被要求打印的值是相等的。

        此外,我从语句 'printf("%p\n", &number1);' 中删除了 &返回值为零。谁能解释一下原因?

        不,不是一般意义上的。当对应于转换说明符的参数不是适合该说明符的类型时,printf() 的行为未定义。 %p 说明符需要一个指针,但您传递了一个 double(在适用的默认转换之后)。

        【讨论】:

        • 并且 1.0 的双精度表示的最后 4 个字节包含全零,因此如果将该值重新解释为指针,它可能会打印 null。但是,这取决于许多因素(即未定义的行为)。
        猜你喜欢
        • 2016-05-20
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        • 2017-03-28
        • 1970-01-01
        • 2019-11-27
        • 2011-03-11
        相关资源
        最近更新 更多