ポインター

描主宇田川浩行K#F85E
上描き希哲7年(2013年)
10月25日 23:34
下描き希哲7年(2013年)
09月30日 00:16
利承
ライセンス
希哲館普通利承(KULクール

基本

宣言

ポインター ptr を宣言したい場合,int *ptr;(アスタリスクを変数の前に置く)int* ptr;(型の前に置く)のように書く。

C はスペースの扱いに寛容なので,最小限のスペースさえ付いていれば機能上の差はない(一般的ではないが,アスタリスクの前後にスペースを入れてもいい)。しいていえば前者(アスタリスクを変数の前に置く)方が全体的に整合性が高い。以下のような例もある。


int* ptr1, ptr2;

(見かけに反して ptr2 がポインターとならない)


int *ptr1, *ptr2;

(見かけ通り ptr1, ptr2 ともにポインターとなる)

初期化

必ず正しい初期化を行うこと。初期化されていない自動変数の値(static 以外)は保証されないため。


int *ptr = NULL;

条件式での使い方

条件式における if ( ptr )if ( ptr != NULL ) と同義。

NULL ポインターと 0

コンパイラーは文脈によって「0」を NULL ポインターとして解釈する。

代入時には,右辺の 0 は NULL ポインターとみなされる。

比較時には,片方がポインタであれば片方の 0 は NULL ポインターとみなされる。

但し,関数呼び出しの引数には使えない(?)。

定数とポインター

アスタリスクを const の前に持ってくればポインター自体が定数に,const の後ろに持ってくればポインターの対象が定数になる。


char *const a; // char 型への定数ポインター
char const *b; // char 型定数へのポインター
const char *c; // 上に同じ

キャスト

([型] *)[式] というのは,式の値をその型のポインターに変換するという意味。

インクリメントとデクリメント

ポインターは,++ や -- でサイズ分だけ進んだり戻ったりする。

応用

関数ポインター

関数のアドレスを取ることが出来る。

ポインタ同士の減算

双方が同じオブジェクトを指していれば,要素の位置の差が得られる。

この描出は「素描」です。

一覧

=}{*}

しかし,「指示体」程度の翻訳を試みる努力もせず,「ポインターは難しい」とか言わせてた業界,なんなんだ。

=}{*}

ポインター翻訳語,「翻体」がちょっと気に入ってたが,「指示体」か「指点体」あたりを暫定訳語にした方が分かりやすいかもしれない。

=}{*}

何度言ったか分からないが,なぜ C++ 仕様策定者は「ポインタでのメモリ管理が煩雑」という問題を「複数のスマート ポインタを上手く使い分ける」という方法で解決出来ると思ったのだろう。

出力論組プログラム虎哲*イチ 1.01
制作・運営:希哲社
© K1-13 (2007-2019) KiTetuSha