#include <stdlib.h>
#include <stdio.h>
void testFunc1(int** a){
*a = malloc(2*sizeof(int));
(*a)[0] = 5;
(*a)[1] = 6;
}
void testFunc2(int** a){
*a = malloc(2*sizeof(int));
(*a)[0] = 7;
(*a)[1] = 8;
}
int main(){
int** x = malloc(2*sizeof(int*));
set1(&x[0]);
set2(&x[1]);
printf("value:%d\n", x[0][0]);
printf("value:%d\n", x[0][1]);
printf("value:%d\n", x[1][0]);
printf("value:%d\n", x[1][1]);
return 0;
}
出力:
value:5
value:6
value:7
value:8
仕組みを視覚化する:
x --> x[0] | x[1]
| |
\/ \/
? ?
x[0] (x[1]) が指しているアドレスを変更したい。関数が実際にそれを変更できるようにするには、参照として x[0] (x[1]) を渡す必要があります。x[0] (...) は int へのポインター (つまり int* ) であるため、関数の引数は int へのポインター (つまり int** 型) へのポインターである必要があります (C で) . したがって、x[0] のアドレスで set1 を呼び出します。set1 では、malloc によって返されたアドレスを、引数として取得したアドレスに格納します。したがって、それを逆参照して、まさにそれを行います。