2014-12-12 3 views
0

Я смущен, почему это бросает ошибку warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’:предупреждение: формат «% d» ожидает аргумент типа «Int», но аргумент 2 имеет тип «Int *»

int x = 5; 
int **y = &x; 
printf("%d", y); 

Хотя это работает?

int x = 5; 
int *y = &x; 
printf("%d", *y); 
+2

В вашем первом примере вы имеете в виду 'int * y', а не' int ** y'? – psmears

+0

Неправильно; первый для того, что сказал @psmears, второй, потому что '% d' для целых чисел; 'int *' не является целым числом. Используйте '% p'. – Qix

ответ

0

Потому что вы объявили y как указатель на целое число во второй версии, так что компилятор получает теплое и нечеткое чувство, что *y является действительным числом.

В первой версии y был объявлен как указатель на указатель на целое (что, как я всегда думал об этом в моей голове в любом случае), так *y должны разрешаться в указатель целого, а не целое число - компилятор предупреждает вас, что он может не совпадать с %d в вашем printf.

Отредактировано спасибо @KierBorromeo, поймав глупую опечатку с моей стороны.

+1

Является ли '' '' и '' '' опечаткой, сэр? – srph

+0

@KierBorromeo Действительно, спасибо, что поймали это. – rchang

0

Поскольку вы определили y как указатель на указатель на INT, так что вы можете сохранить адрес указателя ИНТ на y, но то, что вы пытаетесь сделать, это сохранить адрес в int.

+0

Предлагаю избегать фразы «двойной указатель»; это также означает 'double *'. –

+0

Спасибо за исправление, я так и не подумал об этом. – OiciTrap

1

Я думаю, что проблема с первой версией является то, что: тип y является указатель на указатель, который указывает на целое число в то время как &x это адрес, который можно рассматривать как указатель, который указывает на целое число. Очевидно, что существует несоответствие.

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

1

Ошибка поясняется. Вы отправляете int*, где ожидается int.

int x = 5; 
int *y = &x; 
printf("%d", y); // <-- y is an int* - ERROR 

int x = 5; 
int *y = &x; 
printf("%d", *y); // <-- y is an int*, so *y is an int - OK 
+0

Это '' 'int ** y = & x;' '' если я не ошибаюсь – srph

+0

Это опечатка в коде OP. 'x' является' int', а '& x' является' int * ', но' int * 'не может быть присвоен' int ** ', поэтому' y' должен быть 'int *' вместо an'int ** '. –

0

Это потому, что в вашем коде, х представляет собой целое число, * у является указателем на целое число, и, таким образом, ** у есть указатель на указатель, который указывает на целое число. Его так же хорошо, как и *y = &&x;.

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

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