2次元配列
2次元配列の正体は?
#include <stdio.h> int main(int argc, char *argv[]) { char matrix[3][2] = { {0, 1}, {2, 3}, {4, 5} }; printf( "--- value ---\n" ); printf( "matrix[0][0] = %d\n", matrix[0][0] ); printf( "matrix[0][1] = %d\n", matrix[0][1] ); printf( "matrix[1][0] = %d\n", matrix[1][0] ); printf( "matrix[1][1] = %d\n", matrix[1][1] ); printf( "matrix[2][0] = %d\n", matrix[2][0] ); printf( "matrix[2][1] = %d\n", matrix[2][1] ); printf( "--- address ---\n" ); printf( "matrix = %016lX\n", (unsigned long)matrix ); printf( "matrix[0] = %016lX\n", (unsigned long)(matrix[0]) ); printf( "&(matrix[0][0]) = %016lX\n", (unsigned long)&(matrix[0][0]) ); printf( "&(matrix[0][1]) = %016lX\n", (unsigned long)&(matrix[0][1]) ); printf( "matrix[1] = %016lX\n", (unsigned long)(matrix[1]) ); printf( "&(matrix[1][0]) = %016lX\n", (unsigned long)&(matrix[1][0]) ); printf( "&(matrix[1][1]) = %016lX\n", (unsigned long)&(matrix[1][1]) ); printf( "matrix[2] = %016lX\n", (unsigned long)(matrix[2]) ); printf( "&(matrix[2][0]) = %016lX\n", (unsigned long)&(matrix[2][0]) ); printf( "&(matrix[2][1]) = %016lX\n", (unsigned long)&(matrix[2][1]) ); return 0; }
実行結果
--- value ---
matrix[0][0] = 0
matrix[0][1] = 1
matrix[1][0] = 2
matrix[1][1] = 3
matrix[2][0] = 4
matrix[2][1] = 5
--- address ---
matrix = 00007FFF5FBFF900
matrix[0] = 00007FFF5FBFF900
&(matrix[0][0]) = 00007FFF5FBFF900
&(matrix[0][1]) = 00007FFF5FBFF901
matrix[1] = 00007FFF5FBFF902
&(matrix[1][0]) = 00007FFF5FBFF902
&(matrix[1][1]) = 00007FFF5FBFF903
matrix[2] = 00007FFF5FBFF904
&(matrix[2][0]) = 00007FFF5FBFF904
&(matrix[2][1]) = 00007FFF5FBFF905
値の取得は簡単だね。値を格納するのも同じだよ。
アドレスをよーく見てね、すべて連続してるよ。
実は、1次元の配列なんだけど、
ヒトが指定した2つ添字からどの変数が該当するかを、
Cコンパイラさんが計算してくれてるよ。
今回も添字を指定しないで取得できるアドレスと、
最初の変数のアドレスは一緒だね。
添字を1つだけ指定したときのアドレスは、
2つ目に[0]を指定したときの変数と同じアドレスだね。
2次元配列もアドレスを格納した変数は存在しないよ。
行列や表を表現するのに、2次元配列は使えそうだね。
Leave a Comment