### ポインタのポインタ
int main(void) {
int p0 = 12345;
int *p1;
int **p2; // ポインタのポインタ
int ***p3; // ポインタのポインタのポインタ
int t1, t2, t3;
p1 = &p0;
p2 = &p1;
p3 = &p2;
t1 = *p1;
t2 = **p2;
t3 = ***p3;
printf("t1=%d, t2=%d, t3=%d", t1, t2, t3);
return 0;
}
$ gcc main.c -o main && ./main
t1=12345, t2=12345, t3=12345
全てp0の値を出力する
### 配列を指すポインタ
int main(void) {
int t[3] = {1, 2, 3};
int (*p)[3];
int t1;
p = &t;
t1 = (*p)[1];
printf("t1=%d\n", t1);
return 0;
}
$ gcc main.c -o main && ./main
t1=2
配列は通常の配列だけでなく、ポインタも配列として表現できる
int main(void) {
int a[2][3][4] = {
{{1,2,3,4}, {5,6,7,8},{9,10,11,12}},
{{13,14,15,16}, {17,18,19,20},{21,22,23,24}}
};
int *b;
int (*c)[4];
int (*d)[3][4];
int a1, a2, a3;
b = a[1][2]; // 21,22,23,24 の先頭アドレス
c = a[1]; // {13,14,15,16}, {17,18,19,20},{21,22,23,24}の先頭アドレス
d = a; // aの先頭アドレス
a1 = b[3]; // 24
a2 = c[1][2]; // 19
a3 = d[0][1][2]; // 7
printf("a[1][2][3] = %d\n", a[1][2][3]); // 24
printf("a1=%d, a2=%d, a3=%d\n", a1, a2, a3); // 24, 19, 7
return 0;
}
$ gcc main.c -o main && ./main
a[1][2][3] = 24
a1=24, a2=19, a3=7
ポインタは配列だけでなく、連想配列としても宣言できる。
想定通りの時の高揚感が良い
int main(void) {
int k1=1, k2=2, k3=3;
int *p[3] = {&k1, &k2, &k3};
int t;
for (t=0; t<3; t++){
int value = *p[t];
printf("value=%d\n", value); // 1, 2, 3
}
return 0;
}
$ gcc main.c -o main && ./main
value=1
value=2
value=3
for文にしただけ
int main(void) {
int k;
char *mes[] = {"one", "two", "three", (char *) NULL};
for(k=0; mes[k]; k++){
printf("mes=%s, ", mes[k]); // one two three
}
return 0;
}
$ gcc main.c -o main && ./main
mes=one, mes=two, mes=three,
for文でmes[k]となっているので、kに値があるまでで(char *) NULLは出力されない