Linux講座にようこそ。このページは「C言語プログラミング入門 - 第8章.データをアドレスで操作するためのポインタ」です。
C言語でのポインタとは、データが格納されている場所の位置情報です。通常、データは変数や配列に格納されていて、それらはメモリに有りますので、メモリ上のアドレス(番地)ということになります。
ポインタを扱う場合、ポインタの値を記憶しておくための変数が必要になります。この変数を当講座では「ポインタ変数」と呼ぶことにします。ポインタ変数には変数や配列の先頭アドレスを格納します。このことにより、ポインタ変数が変数や配列を指し示すことが出来るようになり、ポインタ変数を使って変数や配列の操作を行うことができます。
図8-1の例ではポインタ変数pとint型変数aが有り、変数pには変数aの先頭アドレスを設定(代入)します。この操作により、変数pの値は変数aの先頭アドレスになります。(変数aの値は100のままです)以降、ポインタ変数pを使って、int型変数aの値を操作することが出来るようになります。(もちろん、変数aの名前で値を操作することも出来ます)
ポインタを使うメリットとしてはプログラム実行の高速化が有ると思います。ポインタ変数を使ってデータを操作するということはアドレスを指定してデータを操作することになりますので、余計な命令を実行することなく直接的にデータの操作を行うことになります。一方、デメリットとしてはプログラムが複雑になりがちですので、不良が入り込む確率が高くなりますし、理解しにくいプログラムになる可能性があります。
ポインタ変数も変数の一種ですので、使用するには宣言が必要ですし、宣言をするには型名が必要になります。C言語ではポインタ用の型名が用意されているわけではなく、ポインタ変数が値として持つアドレスにある変数や配列の型名を型名とします。図8-1の例では変数aはint型ですので、ポインタ変数pの型名はint型になります。
ポインタ変数の宣言をするときには変数名の前に*(アステリスク)を付けます。他の変数の宣言と大きく異なりますので注意してください。
ポインタ変数の設定は変数のアドレスを求めるためのアドレス演算子(&)を変数名の前に付けて先頭アドレスを取得して、それを代入します。ただし、配列の場合は内部的に配列名自体がポインタとして定義されているため、アドレス演算子を付けません。
scanf関数で変数に入力する場合、変数名の前に&を指定しますが、これはアドレス演算子を指定して、変数の先頭アドレスを指定したことになります。また、配列に入力する場合は、配列名の前に&を指定しませんが、配列名を指定すれば配列の先頭アドレスを指定したことになるためです。
この例題は宣言と代入しか行っていませんので、実行しても何も表示しません。
*
を付けます*
を付けません