多次元配列,初期設定,及び,ポインタ

01	/****************************************/
02	/* 多次元配列,初期設定,及び,ポインタ */
03	/*      coded by Y.Suganuma             */
04	/****************************************/
05	#include <stdio.h>
06
07	int main()
08	{
09	/*
10		 初期設定された値と確保された領域のサイズ
11	*/
12		int x1[3][2] = {{1, 2}, {3, 4}, {5, 6}};          /* 3行2列 */
13		int x2[][2] = {{1, 2}, {3, 4}};                   /* 2行2列 */
14		printf("%d (%dバイト)\n", x1[1][1], sizeof(x1));
15		printf("%d (%dバイト)\n", x2[1][1], sizeof(x2));
16	
17		char c1[5][10] = {"zero", "one", "two", "three"}; /* 5行10列 */
18		char c2[][10] = {"zero", "one", "two", "three"};  /* 4行10列 */
19		char *c3[] = {"zero", "one", "two", "three"};   // 使用すべきではない(警告が出力される)
20		printf("%s (%dバイト)\n", c1[3], sizeof(c1));
21		printf("%s (%dバイト)\n", c2[3], sizeof(c2));
22		printf("%s (%dバイト)\n", c3[3], sizeof(c3));
23	/*
24		 要素の参照
25	*/
26		int *px  = (int *)x1;   // 配列 x1 のアドレス( x1 を 1 次元配列として処理,Java では不可)
27		int *px1 = x1[2];   // 配列 x1 の 3 行目の先頭アドレス
28		char *pc = &(c1[2][0]);   // pc = c1[2]; でも可
29		printf("%d %d %d %d\n", x1[2][1], px[2*2+1], *(px+2*2+1), px1[1]);
30		printf("%c%c%c %s\n", c1[2][0], pc[1], *(pc+2), pc);
31	
32		return 0;
33	}
		

  このプログラムを実行すると,以下のような結果が得られます.ただし,19 行目の表現に対してはコンパイラによって警告メッセージが出力されるため,使用しない方が良いと思います.
	4 (24バイト)
	4 (16バイト)
	three (50バイト)
	three (40バイト)
	three (16バイト)
	6 6 6 6
	two two