### 2次元のポインタ配列
int main( void ) { int *k[2][3]; int t0=0, t1=1, t2=2, t3=3, t4=4, t5=5; int i,j; k[0][0] = &t0; k[0][1] = &t1; k[0][2] = &t2; k[1][0] = &t3; k[1][1] = &t4; k[1][2] = &t5; for(i=0; i<2; i++) { for(j=0; j<3; j++){ int m = *k[i][j]; printf("%d ", m); } printf("\n"); } return 0; }
$ gcc main.c -o main -lm && ./main
0 1 2
3 4 5
入れ子のfor文は基本
### ポインタ配列を指すポインタ
int main( void ) { int t1=1, t2=2, t3=3; int *a[3] = {&t1, &t2, &t3}; int *(*k)[3] = &a; int j1, j2, j3; j1 = *(*k)[0]; j2 = *(*k)[1]; j3 = *(*k)[2]; printf("j1=%d, j2=%d, j3=%d", j1, j2, j3); return 0; }
$ gcc main.c -o main -lm && ./main
j1=1, j2=2, j3=3
ポインタのポインタと同じように配列もポインタ配列のポインタができる
int main( void ) { int a[2][3] = {{1,2,3},{4,5,6}}; int (*k)[2][3] = &a; int i, j; for(i=0; i<2; i++){ for(j=0; j<3; j++){ int m = (*k)[i][j]; printf("%d ", m); } printf("\n"); } return 0; }
### 関数を指すポインタを返す関数
double f1(char c){ return c + 1.0; } double f2(char c){ return c + 2.0; } double(*f(int flag))(char){ if(flag == 0) return f1; else return f2; } int main( void ) { double (*p)(char); // 関数を指すポインタ char c = (char)0; double x; p = f(0); x = p(c); printf("[1]x = %g\n", x); p = f(1); x = p(c); printf("[2]x = %g\n", x); return 0; }
### 配列を指すポインタを返す関数
int (*a(double x))[2] { static int t[2] = {10, 20}; t[0] += x; t[1] += x; } int main( void ) { int (*q)[2] = a(2.0); int q1 = (*q)[0]; int q2 = (*q)[1]; printf("q1=%d, q2=%d\n", q1, q2); return 0; }
これはそのまま
int *(*f(double x, int y))[2] { static int t1 = 10, t2 = 20; static int *t[2] = {&t1, &t2}; t1 += x; t2 += y; return &t; } int main( void ) { int *(*q)[2] = f(2.0, 5); int q1 = *(*q)[0]; int q2 = *(*q)[1]; printf("q1=%d, q2=%d\n", q1, q2); return 0; }
$ gcc main.c -o main -lm && ./main
q1=12, q2=25
これもそのままです。
### 不完全型の配列を指すポインタ
int main( void ) { int a[3] = {1, 2, 3}; int (*p)[] = (int (*)[])a; int a1 = (*p)[0], a2 = (*p)[1], a3 = (*p)[2]; printf("a1=%d, a2=%d, q3=%d\n", a1, a2, a3); return 0; }