2016-01-06 4 views
1

поэтому у меня есть фрагмент кода, который должен печатать адрес номера и адрес ptr. Это код:C++ разница между% p и 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

Адрес е Ptr: 0xbfb7e34c

0xbfb7e348

Почему два адреса печатаются с использованием спецификатора% р Конверсионные же? При использовании & адреса различаются, что я ожидаю, поскольку числа 1 и fPtr сохраняются в разных адресах.

Кроме того, я убираю & из инструкции 'printf ("% p \ n", & number1);' возвращаемое значение равно нулю. Может ли кто-нибудь объяснить, почему?

ответ

7

Здесь вы напечатав адрес из fPtr:

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

И здесь, вы печатаете значение из fPtr:

printf("%p", fPtr); 

Это не то же самое вещь.

Если вы хотите напечатать адрес fPtr с printf, то вам нужно

printf("%p", &fPtr); 

Если вы хотите напечатать значение fPtr с std::cout, то вам нужно

cout << fPtr << endl; 
2

Кодекса кажется, отсутствует & перед fPtr в строке printf. Попробуйте изменить это:

printf("%p", &fPtr); 
1

Почему два адреса печатаются с использованием спецификатора% р Конверсионные же?

Ну, у вас есть

fPtr = &number1; 

// ... 

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

// ... 

printf("%p", fPtr); 

Было бы очень удивительно, если бы эти два printf() вызовы сделал не печать то же самое, так как ценности, которые они просят напечатать равны.

Кроме того это я забрать & от оператора 'Е ("% п \ п", & Number1);' возвращаемое значение равно нулю. Может ли кто-нибудь объяснить, почему?

Нет, не в каком-либо общем смысле. Поведение не определено, если аргумент, соответствующий спецификатору преобразования, не относится к типу, подходящему для этого спецификатора. Спецификатор %p ожидает указатель, но вы передаете double (после соответствующего преобразования по умолчанию).

+0

И последние 4 байта двойного представления 1.0 содержат все нули, поэтому, если это значение повторно интерпретируется как указатель, оно может печатать нуль. Однако это зависит от многих факторов (т. Е. Неопределенного поведения). – axalis