=== 6. ポインタ ======================
ある型Tがあった時、型T*を「型Tを指すポインタ型」という。ポインタ型は他の型から作るので派生型。
ポインタの計算
アドレス演算子:変数のアドレスを&変数名で得る
間接参照演算子:ポインタが指している先の変数の値を*変数名で調べる
ポインタに整数を加えると、指定個数だけ先を指すポインタを得ることができる。
同じ型のポインタは、比較演算子で比較できる。
NULLポインタはどこも指さないポインタを表す定数です。NULLポインタの先を参照してはいけない。参照したらプログラム実行時にエラーになることがある。一般にNULLポインタの先の参照は、コンパイラがコンパイル時に見つけることはできません。
無効なポインタ
無効なポインタとは、有効なオブジェクトや関数を指していないポインタのこと。メモリを解放した後の変数や初期化されていないautoのポインタ変数の値などは参照してはいけない。
配列とポインタ
配列の名前は、その配列の先頭の要素へのポインタ値と解釈される。
int a[10];
という配列が定義されるとき、aは&a[0]と同じ型、同じ値になる。配列の名前が配列の先頭要素へのポインタと見做される規則には一つだけ例外がある。sizeof演算子の振る舞いで、sizeof(a)の値は配列aの全体の大きさとなる。なので、sizeof(a)とsizeof(&a[0])の値は異なる。式a[i]は、*((a) + (i))と定義されている。また、関数の引数に配列が登場した場合、それは実際にはポインタとなる。例えば、
int count_it(char a[]);
という関数宣言は、
int count_it(char *a);
という意味になる