第十章 ポインタ


これまでやってきた、例えば
     int a;
     a=10;
などのプログラムで、“a に 10 を入れる”というような、この“10”という情報は、
一時的にコンピュータ内部で記憶されています。

その記憶装置をメモリといい、個々のデータを1バイト単位で記憶しています。
(バイトとはデータの大きさの単位)
そのメモリ1つ1つを識別するために、それぞれ、“アドレス・・・番地”というように考えます。

これから習うアドレス演算子とポインタは、このメモリのアドレスに関係する項目です。


アドレス演算子                                                                                                               
今、次のようなプログラムを考えます。

<例>
#include<stdio.h>
main()
{
    int a;
    a=10;
}

これは、int 型データを入れられる箱を作り、その箱に整数 10 を入れています。
このとき、コンピュータ内部では、これらの情報を任意のアドレスに保存しています。             

そのコンピュータ内部で保存されているアドレスを調べるには
アドレス演算子 & を調べたい変数(作った箱)の前につけることで調べられます。

<アドレス演算子>
#include<stdio.h>
main()
{
    int a;
    a=10;
    printf("%d\n",a);     /* aの中身を表示 */
    printf("%d\n",&a);   /* aの箱があるアドレスを表示 */
}
<実行結果>
 10
 1245052

このとき、2行目に表示されるアドレスは任意であるため、
この実行結果と異なった値が表示されても問題ありません。

ポインタ
         アドレスを入れる箱を作ります。

<ポインタ>
#include<stdio.h>
main()
{
    int a;
    int *b;
    a=10;      /* @ */
    b=&a;      /* A */
    printf("a=%d\n",a);
    printf("aのアドレス=%d\n",&a);
    printf("b=%d\n",b);
    printf("bのアドレス=%d\n",&b);
    printf("bの中にあるアドレスが指す値=%d\n",*b);
}

          今回は実行結果をあとにして、説明します。

          @で、a には 10 という整数を入れています。
          コンピュータ内部では、これらの情報を任意のアドレスに保存するので、
          例えばこの場合、アドレス100番地に作られたとします。

          すると、コンピュータ内部では次のようになっています。

<メモリ領域1>
アドレス  データ  
100
101
10
 

          次にAで、a の箱があるアドレスを、b というアドレス専用の箱に入れています。
          このとき、箱 b はアドレス104番地に作られたとします。

          すると、コンピュータ内部では次のようになっています。

<メモリ領域2>
アドレス  データ  
100
101
102
103
104
10
・・・
・・・
・・・
100
・・・は何が入っているか不明とします。

          メモリ領域が以上の状態であったとすると、このプログラムの実行結果は次のようになります。

<実行結果>
a=10
aのアドレス=100
b=100
bのアドレス=104
bの中にあるアドレスの指す値=10

          実行結果がこのようになる理由をまとめてみました。

<実行結果の解説>
a=10 箱 a には、10 が入っています。
aのアドレス 箱 a のある場所はメモリ領域のアドレス100番地です。
b=100 箱 b には、100が入っています。
bのアドレス 箱 b のある場所はメモリ領域のアドレス104番地です。
bの中にあるアドレスの指す値 b には100が入っているので、アドレス100番地の指す値、つまり10です。

          どうですか?なんとなくわかるような気がしませんか?

          初めてポインタを勉強するとき、ポインタ変数を *b だと勘違いしやすいのですが、
          決して *b ではありません。
          ポインタ変数は、b です。

          次のようにちょっと書き直すとわかりやすいと思います。
           int *b;    →    (int *)b;
          つまり、int * が今まで勉強してきた、int,double,char みたいな型なのです。

<前に戻る  |目次|  次へ進む>