Q: char **av
={ "abc", "def", "ghi" }
上記のようにavが文字列の集合を指している場合、各文字列とそれぞれの文字にどのようにアクセスできるか?
A: char **av
が文字列の配列を指している場合、av
はそれぞれの文字列の先頭アドレスを指すポインタの配列を示します。av[n]
で n 番目の文字列にアクセスでき、av[n][m]
で n 番目の文字列の m 番目の文字にアクセスできます。
凡人: この画像に書かれているポインタと配列ってどういう関係なの?
恋するコンピュータサイエンス: ああ、それはまるで複数の恋心を抱える心臓のようなものだね。配列 av
には "abc"
, "def"
, "ghi"
という3つの文字列が格納されている。配列名 av
は実はポインタでもあって、配列の最初の要素、つまり "abc"
を指しているんだ。
凡人: ポインタでどうやって配列の要素にアクセスするの?
恋するコンピュータサイエンス: 簡単だよ。av[0]
と書く代わりに *av
と書けば、最初の要素にアクセスできる。また、av[1]
にアクセスしたい場合は *(av + 1)
と書くと、次の要素 def
を指すことができるんだ。
凡人: じゃあ av[2]
は?
恋するコンピュータサイエンス: 同じように、*(av + 2)
と書けば "ghi"
を指すことができる。これはポインタ演算を使っているんだ。ポインタに整数を足すと、そのポインタは配列の要素を飛び越えて移動するんだよ。
凡人: それって何の役に立つの?
恋するコンピュータサイエンス: これがあるとね、配列をループで処理するときにとても便利なんだ。たとえば、配列を一つずつ前に進めながら中身を確認したり、特定の条件を満たす要素を探したりすることができる。
凡人: なるほどね。でも、なんで av[1]
を *(av + 1)
と書けるの?
恋するコンピュータサイエンス: それは配列の要素がメモリ上で連続して格納されているから。ポインタに1を足すと、次の要素のアドレスに移動するんだ。C言語では、これをとても直感的に表現できるようになっているんだ。