{指示体}{ポインタ}{C}{素描}(4)

{ポインター K#F85E/EDF2}

基本

宣言

ポインター <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} 関数のアドレスを取ることが出来る。 **ポインタ同士の減算 双方が同じオブジェクトを指していれば,要素の位置の差が得られる。 </>