%p和cout& ptr

时间:2016-01-06 22:47:33

标签: c++ pointers printf cout

所以我有一段代码需要打印一个数字的地址和一个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转换说明符打印的两个地址相同?当使用&amp;地址是不同的,这是我所期望的,因为number1和fPtr保存在不同的地址。

此外,我带走了&amp;来自声明&#39; printf(&#34;%p \ n&#34;,&amp; number1);&#39;返回值为零。谁能解释为什么?

3 个答案:

答案 0 :(得分:7)

在此,您正在打印fPtr地址

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

在这里,您正在打印fPtr

printf("%p", fPtr);

那些不一样。

如果您要使用fPtr打印printf的地址,则需要

printf("%p", &fPtr);

如果您想使用fPtr打印std::cout的值,则需要

cout << fPtr << endl;

答案 1 :(得分:2)

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

printf("%p", &fPtr);

答案 2 :(得分:1)

  

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

嗯,你有

fPtr = &number1;

// ...

printf("%p\n", &number1);

// ...

printf("%p", fPtr);

如果两个printf()调用打印相同的内容,那将是非常令人惊讶的,因为要求它们打印的值相等。

  

此外,我带走了&amp;来自声明&#39; printf(&#34;%p \ n&#34;,&amp; number1);&#39;返回值为零。谁能解释为什么?

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