C/C++

Читаю книжку по C, помогите с указателями

Сейчас ещё раз перечитываю книгу по си, чтобы укрепить знания (beginning-c-5th-edition-ivor-horton) и тут в седьмой главе столкнулся с непонятным кастом:
Объяснение автора:
The cast to void* is to prevent a possible warning from the
compiler.
Какой ещё варнинг от компайлера может быть? У нас же указатель int*, а не void*, он явно объявлен и инициализирован, как int*. Объясните..
Night Wolf ***
Night Wolf ***
392
В данном месте такое приведение типов лишено какого-либо смысла.
Взятие адреса переменной-указателя - совсем не экзотика (получаем значение типа **int) и нормальный компилятор предупреждений не даёт:
https://onlinegdb.com/EfiAun7JX
АН
Александр Науменко
72 759
Лучший ответ
Павел Лимонов Ну, онлайнгдб и на неиницализированные переменные в стеке не ругается, пока не включишь ему что-нибудь вроде
 -Wall -Wextra -pedantic-errors 
Там gcc, вроде?
И на этот указатель он с такими флагами орёт
 main.c: In function ‘main’:
main.c:14:26: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int *’ [-Wformat=]
14 | printf("Hello World %p\n", &i);
| ~^ ~~
| | |
| | int *
| void *
| %ls
Это предупреждение а не ошибка, так что не бойся.
А предупреждают на всякий случай, вдруг ты это не хотел.
Вам надо вывести адрес переменной, а она указатель, вот поэтому и надо &pnumber для получения адреса, а
так как
%р Выводит на экран значение указателя
то превратили это преобразованием в void*
По идее можно было бы %d и вывести просто &pnumber
Надо пробовать, я уже так точно не помню, как там выводил.
Kauish Baktybaev
Kauish Baktybaev
63 560
Вроде как есть маленькие тонкости с указателями.
Первая - стандарт С не гарантирует очевидной вещи, что указатели разного типа имеют одинаковый размер. Поэтому чисто в теории приведение одного указателя к другому может привести к потере данным.
Вторая - выравнивание (Возможно как следствие из первого, но уж слишком мутная тема, связанная с разными архитектурами и соответственно компиляторами).
EXP36-C
И если для архитектуры x86 максимум что может произойти - замедление кода, то у других архитектур - фиолетовый экран смерти, или что там у них вместо синего.

Так что некоторые компиляторы имеют право предупреждать.
Но в данном случае функция printf c параметром %p что так, что эдак принимает все указатели как void*, а мы же ей доверяем? То просим и особо бдительные компиляторы доверять.