基本
宣言
ポインター <var>ptr</var> を宣言したい場合,int *<var>ptr</var>;
(アスタリスクを変数の前に置く)か int* <var>ptr</var>;
(型の前に置く)のように書く。
C はスペースの扱いに寛容なので,最小限のスペースさえ付いていれば機能上の差はない(一般的ではないが,アスタリスクの前後にスペースを入れてもいい)。しいていえば前者(アスタリスクを変数の前に置く)方が全体的に整合性が高い。以下のような例もある。
>=cpp
>int* ptr1, ptr2;
<
(見かけに反して <var>ptr2</var> がポインターとならない)
>=cpp
>int *ptr1, *ptr2;
<
(見かけ通り <var>ptr1</var>, <var>ptr2</var> ともにポインターとなる)
初期化
必ず正しい初期化を行うこと。初期化されていない自動変数の値(static 以外)は保証されないため。
>=cpp
>int *ptr = NULL;
<
条件式での使い方
条件式における if ( <var>ptr</var> )
は if ( <var>ptr</var> != NULL )
と同義。
NULL ポインターと 0
コンパイラーは文脈によって「0」を NULL ポインターとして解釈する。
代入時には,右辺の 0 は NULL ポインターとみなされる。
比較時には,片方がポインタであれば片方の 0 は NULL ポインターとみなされる。
但し,関数呼び出しの引数には使えない(?)。
定数とポインター
アスタリスクを const の前に持ってくればポインター自体が定数に,const の後ろに持ってくればポインターの対象が定数になる。
>=cpp
>char *const a; // char 型への定数ポインター
>char const *b; // char 型定数へのポインター
>const char *c; // 上に同じ
<
キャスト
([型] *)[式]
というのは,式の値をその型のポインターに変換するという意味。
**インクリメントとデクリメント
ポインターは,++ や -- でサイズ分だけ進んだり戻ったりする。
*応用
**{関数ポインター #F85E/A-4C2F}
関数のアドレスを取ることが出来る。
**ポインタ同士の減算
双方が同じオブジェクトを指していれば,要素の位置の差が得られる。
</>