C言語の基礎

int m[3][4];
printf("%td\n", (char *)&m[2][1] - (char *)&m[0][0]);

int は4バイトとする。上のコードを実行したときの出力として、正しいものはどれか。

  1. A9
  2. B20
  3. 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 バイトです。
この分野を解く 分野ページへ

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

C言語の基礎のほかの問題

  1. 文字列を入れた char の配列について、上のコードを実行したときの出力として、正しいものはどれか。
  2. 上の宣言の後に、ア「p = t;」、イ「*p = 'x';」、ウ「q = t;」、エ「*q = 'x';」のどれかを書く。コンパイルエラーになるものの組み合わせはどれか。
  3. 関数ポインタの配列を使った上のプログラムを実行したときの出力として、正しいものはどれか。
  4. fill と use は別に定義された関数とする。上の関数の問題点として、正しいものはどれか。
  5. 上の関数 make が返すポインタについて、正しいものはどれか。