Когда я компилирую следующий код, я получаю предупреждение компилятора.
#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
также может изменить указатель.