I-14-4. ポインタを利用した効果的なプログラミング

メモリ上に配置されているデータの抽象化とアドレスの考え方を示し、ポインタの概念、特徴、利用方法について解説する。また配列や文字列、関数を利用する際にポインタを上手に利用する技法を示し、関数ポインタの概念についても言及する。

【学習の要点】

* すべての変数はアドレスを割り当てられ、そのアドレスが指すメモリに保存されている。

* ポインタとは、あるデータが格納されているメモリのアドレスを保存したものである。

図I-14-4. ポインタの概念

【解説】

1) データ格納アドレスの抽象化

メモリ上のデータは、本来ならばアクセスするのにメモリのアドレスを指定する必要がある。しかし、データにアクセスするためにいちいち人が手でメモリのアドレスを指定するのは、非常に困難である。そのため、データに変数名をつけて、その名前を指定することでデータが入っているメモリにアクセスできるようにした。こうすることで、データをメモリの実アドレスを指定することなく、抽象的に扱うことができるようになる。

2) ポインタの概念、特徴、利用方法

変数はそれぞれコンパイラによって自動的にアドレスを割り当てられる。通常はこのアドレスを意識する必要はないが、ポインタを使うことでアドレスを利用することができる。ポインタは、メモリのアドレスを保存しておくためのものである。ポインタ型の変数を利用するには、変数名の前に「*」をつけて宣言をする必要がある。また、ポインタに関する演算子として、アドレスを表す「&」、逆参照を表す「*」がある。例えば、「&var」は変数varのアドレスを指すポインタを示し、「*ptr」はポインタ変数ptrが指すアドレスに格納されている値を示す。

3) 関数引数としてのポインタ

Cでは引数は値呼び出しで関数に渡される。変数を引数として関数に渡しても、その変数の値を関数内から変更することはできない。。しかし、ポインタを引数として関数を宣言し、関数呼び出し時にアドレスを渡すと、関数内でポインタが差す値(実際に引数として使用される変数の値)を変更することができるようになる。

4) ポインタと配列

Cでの配列の宣言の仕方は、次のとおりである。

型名 配列名[確保したい配列の要素数];

配列の要素を指定するときは、「 配列名[要素番号] 」のように記述する。

例)

int arr[100];

arr[3] = 21;

この例の場合、Cでは単に「 arr 」と書くことで、配列arrの先頭要素を指すポインタを表すことになる。つまり、「 arr 」は「 &arr[0] 」と等価である。

5) ポインタと文字列

Cには文字列型がなく、文字列は文字を配列にしたものであらわされる。配列で表せるということは、ポインタでも表せるということである。

6) 関数ポインタについて

関数も変数と同じくメモリ上にアドレスを持っている。これは関数のポインタということができ、ポインタ変数で扱うことができる。これを使用することで、動的に呼び出す関数を変えることができる。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。