2016-12-20 7 views
-3
#include <stdio.h> 

int main() 
{ 
    int *ptr; 
    int a=2; 
    ptr=&a; 
    printf("%p\n",ptr); 
    printf("%d\n",ptr); 
    printf("%p\n",a); 
    return 0; 
} 

Выход я получаю:Что такое% p и почему он отличается от печати значения int указателя, используя% d?

% ./a.out 
0x7ffe12032c40 
302197824 
0x2 
% 

Значение первых двух выходных изменений (очевидно, из-за ASLR) и 0x2 остается постоянной.

+5

'printf ("% d \ n ", ptr);' не определено поведение. – Ari0nhh

+6

размер указателя не всегда совпадает с размером int –

+1

Кроме того, используйте '% zu' для' size_t' (вместо '% u') и'% zd' для 'ssize_t'. – e0k

ответ

1

Размер указателя не равен размер междунар, поэтому вы не можете использовать% D вместо% р% р используется для значение печати, хранящееся в переменной указателя, также используя% p с переменной int, является неопределенным поведением (если вы находитесь в системе, у которых указатель и int имеют одинаковый размер, вы можете увидеть правильный результат, но, как C, его неопределенное поведение)

sizeof int определяется компилятором, разные компиляторы могут иметь разный размер int на одной машине, но размер указателя определяется типом машины (8,16,32,64 бит)

0

Это для печати указателей. Точно так же вы не печатаете поплавок с %d, вы не должны печатать указатель с %d.

0

0x2 просто шестнадцатеричное представление целого числа 2. Вот почему вы видите, что вывод

Е() печатает значение переменной а в шестнадцатеричном формате. Если вы хотите, чтобы напечатать адрес, выполните следующие действия

printf("%p",&a); 
0

Когда вы используете %p как в

printf("%p\n",ptr); 

%p формата спецификатор для указателей, вы получите ожидаемые результаты

При использовании %d как в

printf("%d\n",ptr); 

%d формата спецификатор для целых чисел , вы получаете неожиданные результаты, потому что размер pointers (обычно 8 байтов) может отличаться от размера signed integers (который обычно составляет 4 байта эс).