Учитывая, что имя массива фактически является указателем на первый элемент массива, используется следующий код:
#include <stdio.h>
int main(void)
{
int a[3] = {0, 1, 2};
int *p;
p = a;
printf("%d\n", p[1]);
return 0;
}
печатает 1
, как и ожидалось.
Теперь, учитывая, что я могу создать указатель, который указывает на указатель, я написал следующее:
#include <stdio.h>
int main(void)
{
int *p0;
int **p1;
int (*p2)[3];
int a[3] = {0, 1, 2};
p0 = a;
p1 = &a;
p2 = &a;
printf("p0[1] = %d\n(*p1)[1] = %d\n(*p2)[1] = %d\n",
p0[1], (*p1)[1], (*p2)[1]);
return 0;
}
Я ожидал, что он скомпилирует и напечатает
p0[1] = 1
(*p1)[1] = 1
(*p2)[1] = 1
Но вместо этого во время компиляции происходит сбой, говоря:
test.c: In function ‘main’:
test.c:11:5: warning: assignment from incompatible pointer type [enabled by default]
Почему это назначение неверно? Если p1
является указателем на указатель на int
, а a
является указателем на int
(потому что это имя массива int
с), почему я не могу присвоить &a
до p1
?