Ответ 1
Просто нарисуйте указатель int на пустоту:
printf( "Address of p1: %p\n", ( void * )pt1 );
Ваш код безопасен, но вы компилируете флажок предупреждения -Wformat
, который будет набирать проверку вызовов на printf()
и scanf()
.
Проблема с печатью указателя. Каждый раз, когда я пытаюсь скомпилировать программу ниже, я получаю следующую ошибку:
pointers.c:11: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘int *’
Мне явно не хватает чего-то простого здесь, но из других примеров подобного кода, которые я видел, это должно работать.
Здесь код, любая помощь будет большой!
#include <stdio.h>
int main(void)
{
int x = 99;
int *pt1;
pt1 = &x;
printf("Value at p1: %d\n", *pt1);
printf("Address of p1: %p\n", pt1);
return 0;
}
Просто нарисуйте указатель int на пустоту:
printf( "Address of p1: %p\n", ( void * )pt1 );
Ваш код безопасен, но вы компилируете флажок предупреждения -Wformat
, который будет набирать проверку вызовов на printf()
и scanf()
.
Обратите внимание, что вы получаете простое предупреждение. Ваш код будет вероятно выполняться как ожидалось.
Спецификатор преобразования "%p"
для printf ожидает аргумент void*
; pt1
имеет тип int*
.
Предупреждение хорошо, потому что int*
и void*
могут, на странных реализациях, иметь разные размеры или битовые шаблоны или что-то в этом роде.
Преобразуйте int*
в void*
с помощью...
printf("%p\n", (void*)pt1);
... и все будет хорошо, даже на странных реализациях.
В этом случае компилятор просто немного пережит с предупреждениями. Ваш код совершенно безопасен, вы можете удалить предупреждение с помощью:
printf("Address of p1: %p\n", (void *) pt1);
В сообщении говорится все, но это просто предупреждение не само по себе:
printf("Address of p1: %p\n", (void*)pt1);
Это работало очень хорошо для меня:
printf("Pointer address: %p.", pxy);
Вам не нужно разыгрывать это как что-либо, если вы не хотите...