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

Когда я компилирую следующий код, я получаю предупреждение компилятора.

#include <stdio.h>
int global = 10;
void func_a(const int **pptr) {
    *pptr = &global;
}
void func_b(int *const *pptr) {
    **pptr = 20;
}
int main()
{
    int local = 30;
    int *ptr_1 = &local;
    const int *ptr_2 = &local;
    int* const ptr_3 = &local;
    func_a(&ptr_1); /* line 15 : compile warning */
    func_a(&ptr_2); /* line 16 : compile okay */
    func_a(&ptr_3); /* line 17 : compile warning */

    func_b(&ptr_1); /* line 19: compile okay? */
    func_b(&ptr_2); /* line 20: compile warning */
    func_b(&ptr_3); /* line 21: compile okay */

    return 0;
}

предупреждения:

a.c:15:12: warning: passing argument 1 of 'func_a' from incompatible pointer type [-Wincompatible-pointer-types]
a.c:17:12: warning: passing argument 1 of 'func_a' from incompatible pointer type [-Wincompatible-pointer-types]
a.c:20:12: warning: passing argument 1 of 'func_b' from incompatible pointer type [-Wincompatible-pointer-types]

В моем понимании строки 15 и 17 получили предупреждение компилятора, потому что func_a() не хочет изменять **pptr.(т.е. значение local).И компилятор обнаружил, что можно изменить значение с помощью указателя ptr_1 или ptr_3.

Строка 20 получила предупреждение компилятора, поскольку func_b() не хочет изменять *pptr.(т.е. указатель).И ptr_2 может изменить указатель.

Однако, почему строка 19 не получит никакого предупреждения компилятора?ptr_1 также может изменить указатель.

1 Ответ

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

Объявление int *const *pptr объявляет pptr указателем на постоянную указатель на непостоянную int.

То есть функция может изменить то, на что указывает pptr (pptr = xxx, довольно бесполезно), и вы можете изменить значение int (как вы делаете в своем коде), но вы не можете изменить *pptr (*pptr = yyy недействительно).

Поскольку вы вызываете функцию с указателем на указатель на непостоянную int, все в порядке.

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