C++2 D配列


ある会社の筆記試験問題は、自分で答えを分析し、後で2次元配列要素の表現形式をまとめた.初心者の友达はうるさいのを嫌がらないで、辛抱強く読んで覚えておくと役に立ちます.老鳥たちも意見を言うのを歓迎します.
	int a[4][4] = {
		{1,2,3,4},
		{50,60,70,80},
		{900,1000,1100,1200},
		{13000,14000,15000,16000}
	};
	int (*p1)[4] = a;
	int (*p2)[4] = &a[0];
	int *p3 = &a[0][0];

	printf("%d, %d, %d, %d
", *(*(a+1)-1), *(*(p1+3)-2)+1, *(*(p2-1)+16)+2, *(p3+sizeof(p1)-3) );

64ビット環境で、上記のコードの実行結果を尋ねます.
まず2次元配列名は2次元配列の最初の行のアドレスを指しています
int(*p 1)[4]=aは、4つの整数配列を指すポインタである.
int*p 3=&a[0][0],2次元配列を1次元配列で参照する.
第1の出力:a+1すなわち第2の行のアドレス,*(a+1)すなわち第2の行の第1の要素のアドレス,さらに1つ減らすのはその前の要素アドレス,すなわち第1の行の第4の要素で,結果は4である.
2番目の出力:p 1とp 2とaは同じで、p 1+3は4行目のアドレスであり、*(p 1+3)は4行目の1要素のアドレスであり、さらに2を減らすと3行目の3要素のアドレスであり、結果は1101である.
3番目の出力:p 2-1は4番目の行のアドレスで、*(p 2-1)は4番目の行の1番目の要素のアドレスを表し、16を加えて1周するか、それともこの要素なのか、結果は13002です.
4番目の出力:64ビット環境ではsizeof(p 1)は8であり、p 3+5は1次元配列の5番目の要素、すなわち2次元配列の2行目の2番目の要素を表し、結果は60である.
では、まとめてみましょう.
2 D配列要素a[i][j]には、次のような参照形式があります.
*(a[i]+j)/a[i]は配列のi行目のアドレスであり、jを加えると配列のi行目のj列のアドレスである
*(*(a+i)+j)/a+iは配列i行目アドレス、*(a+i)は配列i行0列目アドレス、jを加えるとi行j列目アドレス