配列の名前が実際には配列の最初の要素へのポインターであるとすると、次のコードは次のようになります。
#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
が an へのポインタへのポインタint
でa
あり、int
(s の配列の名前であるため) へのポインタである場合int
、なぜ に代入できないのでしょ&a
うp1
か?