C言語の基礎

char s[] = "abc", t[] = "xyz";
const char *p = s;
char *const q = s;

上の宣言の後に、ア「p = t;」、イ「*p = 'x';」、ウ「q = t;」、エ「*q = 'x';」のどれかを書く。コンパイルエラーになるものの組み合わせはどれか。

  1. Aアとエ
  2. Bイとウ
  3. Cイとエ
答えと解説を見る

正解:B. イとウ

const char *p は「const な char を指すポインタ」で、p を通して指す先の文字を書き換えることはできませんが、p 自体をほかの番地に変えることはできます。char *const q は「ポインタ自体が const」で、q を変えることはできませんが、q が指す先は書き換えられます。そのため、イ(*p への代入)とウ(q への代入)がエラーになります。const が * の左にあれば指す先、右にあればポインタ自体を変えられない、と読みます。

  • A. アは p 自体の変更、エは q が指す先の変更で、どちらも許されています。
  • B. 正しい。p が指す先の変更と、q 自体の変更がエラーになります。
  • C. エの *q = 'x'; は const でない char への代入なので、書き換えられます。
この分野を解く 分野ページへ

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

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

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

  1. 関数ポインタの配列を使った上のプログラムを実行したときの出力として、正しいものはどれか。
  2. fill と use は別に定義された関数とする。上の関数の問題点として、正しいものはどれか。
  3. 上の関数 make が返すポインタについて、正しいものはどれか。
  4. C言語で free(p); の直後に p = NULL; と書くことが勧められる理由として、最も適切なものはどれか。
  5. 上の関数 save に、8文字の文字列 "ABCDEFGH" を渡した。起こることとして正しいものはどれか。