2015-09-06 3 views
0

Я пытаюсь вернуть адрес указателя, используя приведенный ниже код:возвращая адрес указателя

#include <iostream> 
using namespace std; 

int main(){ 
    int x = 5; 
    int *p = &x; 
    //int **pp = &p; 
    cout << &p << endl; 
    return 0; 
} 

Однако то, что печатается на 0x28fea8, который тот же адрес, х сам. Теперь, если я раскомментирую только прокомментированную строку выше и оставлю все остальное как есть, то то, что печатается, - это 0x28fea4, который кажется правильным адресом указателя.

Мой вопрос, почему мне нужна линия без ранений, чтобы отобразить правильный адрес моего указателя?

Почему "соиЬ < < < < р" и End L, "соиЬ < < & р < < ENDL" как дисплей 0x28fea8, если эта линия слева комментировал?

не должны "соиЬ < < & р < < ENDL" дисплей 0x28fea4 независимо от другой линии?

Я использую Qt Creator в качестве моего компилятора/ide, если это помогает. Я загрузил свой компилятор по следующей ссылке: http://web.stanford.edu/~rawatson/qt/windows_install/index.html

EDIT: Хорошо, как меня глупо. Моя проблема заключалась в том, что я сравнивал адреса, меняя значения, а затем снова запускаю программу. Вместо этого я должен был сравнить, распечатав их все в одном прогоне программы. Когда я сравниваю в одной программе, я получаю разные адреса для p и & p, как и должно быть.

+1

Можете ли вы добавить используемые флагов компилятора в свой пост? Ваш пример отлично работает на G ++ 4.8.4 на Ubuntu с -O3: я получаю два разных выхода, когда я печатаю p и когда я печатаю & p. – Cheiron

+1

'Однако то, что печатается ... - это тот же адрес, что и сам x.' [False.] (Http://rextester.com/RZRVU60305)' p' и '& x' - то же самое. '& p' отличается, поскольку природа предназначена. –

+0

Возможно, это мой компилятор, я обновил сообщение со ссылкой на то, откуда я его загрузил. –

ответ

2

Я не в состоянии воспроизвести то, что вы говорите, с this кодом:

#include <cstdio> 
using namespace std; 

int main() { 
    int x = 5; 
    int* p = &x; 

    printf("x address: %p\n", &x); 
    printf("p value: %p\n", p); 
    printf("p address: %p\n", &p); 

    return 0; 
} 

я получаю следующий результат:

x address: 0xbfd6bba8 
p value: 0xbfd6bba8 
p address: 0xbfd6bbac 

, который является правильным и действительно &p является &x+4, который является правильным на 32-битной архитектуре, поскольку они выделены в стеке.

+0

ya мой вопрос лгал в том, что я сравнивал адреса из разных прогонов моей программы. Чтобы получить правильное сравнение, я должен был напечатать адреса в одной программе, как и вы. –

1
int x = 5; 
int *p = &x; // b stores addres of variabile a 

cout << "Adress of x is : " << p <<endl; // printing the adress of a 
cout << "Value of x is : " << *p << endl; // printing the variabile stores in a 

int **pp = &p; // pp stores thea adress of p 
cout <<"Adress of p is" << pp << endl; //printing the adress of p 
cout << "Adress of x is" <<*pp << endl; //printing the adress of x 
return 0; 

Я надеюсь, что комментарии решают вашу проблему.

Смежные вопросы