メモの日々


2013年03月12日(火) [長年日記]

  • 日曜日の14時頃、関東地方は突然黄色い塵のようなもので覆われた。煙霧なる気象現象とのこと。黄色かったので黄砂が疑われたが、そうではないとの報道。よくわからない。

[c][c++] constとポインタ

基本的なことだけど、constとポインタの関係はすぐ忘れるのでメモしておく。

例えば、

const int* const** const a = 0;

と宣言された変数aは何がconstで何がconstでないのか。

重要なのは、ポインタ自体がconstになるのは*の直後にconstがある場合のみ、ということかなあ。C++ランゲージクイックリファレンスの「2.6.2 宣言子」の節に次のようにある。

ポインタは、先頭のアスタリスク(*)、オプションのcv修飾子、オブジェクト名、オプションの初期化子の順で宣言される。

で、上の例の場合だけれど、右から見ていくのだろうなあ。まず一番右の*の直前で分けて、

(const int* const*)(* const a = 0;)

と考える。aは(const int* const*)へのconstポインタである、となる。つまり、

  • aはconst。(aの値自体は変更できない。)
  • (*a)の型は (const int* const*)。

同じことを繰り返すと、次は

(const int* const)(*)

だから、

  • (*a)はconstではない。
  • (**a)の型は (const int* const)。

となって、更に、

  • (**a)はconst。
  • (***a)の型は (const int)。

となる。(***a)はconstね。これでおしまい。