Разве компилятор хочет сказать, что я не могу указать указатель типа int, используя указатель void?
void ** q
- это тип void **
, а int * p
- это тип int *
.Отсюда следующая строка: void ** q = &p;
гарантирует предупреждение компилятора, так как типы несовместимы.
Если вы введете &p
в void *
, тогда предупреждение в вашем вопросе исчезнет: void ** q = (void *)&p;
Эта строка: printf("memory address=%d\n",(int*)*q);
также должна вызывать предупреждение компилятора, поскольку (int *)*q
имеет тип int *
, но спецификатор формата %d
ожидает int
.Если вы используете спецификатор формата %p
, то это предупреждение также исчезнет.