2014-10-07 4 views
-4

Какая разница между выходом двух функций printf в следующей программе. Должен ли вывод обоих быть одинаковым или нет?Отображение адреса переменной указателя с помощью оператора &

#include<stdio.h> 
    #include<string.h> 
    int main() { 
     int *p; 
     printf("%p",&p); 
     printf("\n%p",p); 
     return 0; 
    } 
+1

Вы пробовали запустить его? –

+0

Попробуйте скомпилировать и запустить => Подумайте, почему => Задайте вопрос, если вы не понимаете. –

+0

Одним из адресов является ссылка «p». Другой - адрес пространства, используемого переменной «p» для хранения этого адреса. –

ответ

0

Первый выводит адрес переменной в текущем фрейме стека.

Второе выдает неинициализированное значение; вы должны включить предупреждения своего компилятора, пока он не пожалуется.

0

Это не то же самое.

  • printf("%p", p); напечатает значение p, то есть адрес междунар он указывает на. (Хотя в вашем примере вы не инициализируете его, чтобы указать на что-либо в частности.)

  • printf("%p", &p); напечатает адрес p, что не так полезно.

1
  • &p - адрес указателя
  • p - адрес указателя на указатель
  • *p -The содержимого внутри указателя адреса с помощью указателя
1

Здесь указатель p объявлен, но не инициализирован, поэтому будет указывать на неизвестную ячейку памяти. Программа должна давать ошибку компиляции. Однако, если вы используете оператор косвенности (*), он даст вам значение местоположения памяти, совпадающего с p (значение Garbbage Value в этом случае). Оператор & используется для поиска адреса, связанного с переменной.

Похожие модификации в программе:

int main() { 
    int *p; 
    printf("%u",*p); 
    printf("\n%u",p); 
    return 0; 
} 

Выход:

некоторая случайная величина (значение мусора) расположение

Память р

+0

WTF? Доступ к * p, когда p содержит случайный мусор, даже хуже, чем код в OP. Предполагая, что 4 байта ints, коэффициенты равны 3 в 4, что значение p не делится на 4, поэтому доступ к * p приведет к ошибке выравнивания. –

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