C言語の基礎
int m[3][4];
printf("%td\n", (char *)&m[2][1] - (char *)&m[0][0]);int は4バイトとする。上のコードを実行したときの出力として、正しいものはどれか。
- A9
- B20
- C36
答えと解説を見る
正解:C. 36
C言語の2次元配列は行優先で並び、m[3][4] は m[0][0]〜m[0][3]、m[1][0]〜m[1][3]、m[2][0]〜m[2][3] の順に置かれます。m[2][1] の前には、2行分の 2 × 4 = 8 個と同じ行の1個の、合わせて9個の要素があります。1要素は4バイトなので、先頭からの距離は 9 × 4 = 36 バイトです。char * に変換してから引いているので、差はバイト数で表されます。
- A. 要素の数(9個)のままで、バイト数に直していない値です。
- B. 列優先(列ごとに並ぶ)と考えた場合の値です((1 × 3 + 2) × 4 = 20)。
- C. 正しい。(2 × 4 + 1) × 4 = 36 バイトです。