По поводу указателей c программирования - PullRequest
0 голосов
/ 21 сентября 2018

Пожалуйста, если кто-нибудь знает, что в этом плохого, сообщите мне

#include"stdio.h"

void main() {
    int a = 10;
    int* p = &a;
    void** q = &p;
    printf("memory address=%d\n",(int*)*q);
}

Вот ошибка компилятора:

предупреждение: инициализация из несовместимого типа указателя [-Wincompatible- pointer-types] void ** q = & p;

ptr3.c: 7: 25: предупреждение: формат "% d" ожидает аргумент типа "int", но аргумент 2 имеет тип "int "[-Wformat =] printf ("адрес памяти =% d \ n", (int ) * q);~ ^ ~~~~~~~~% ls

Может ли компилятор сказать, что я не могу указать указатель типа int с помощью указателя void?

1 Ответ

0 голосов
/ 21 сентября 2018

Разве компилятор хочет сказать, что я не могу указать указатель типа 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, то это предупреждение также исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...