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ね。これでおしまい。