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