C言語 ポインタ変数(1) 定義

C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)

C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)

ポインタ変数とは

「変数などの場所を覚えておくための変数」

ポインタ変数を使うと、1つの変数で、複数の別の変数の代わりをすることが出来たり、配列でポインタ変数を扱うと演算が出来る、とのこと。

#include <stdio.h>
main () {
        int a[5] = {1,2,3,4,5};
        int *p;
        int i;
        p = a; //配列の先頭ポインタを取得 p = &a[0]の省略形

        for (i = 0; i < 5; i++)
        {
                printf("%d\n",*(p+i));
        }
}

ポインタpを int *p によって定義。p = aによってaの1番目の要素(a[0])を割り当てる。for文の中ではp+i(つまりa[0+i])を表示されている。

ポインタの使い道の1つとして、配列の成分にポインタを割り当てて、ポインタを動かすことで配列に対して演算を実行して使う、ということか。

以下出力。

1    //a[0]    for文中では*p+0
2    //a[0+1] for文中では*p+1
3    //a[0+2] for文中では*p+2
4    //a[0+3] for文中では*p+3
5    //a[0+4] for文中では*p+4

なお、以下のように出力を*(p+i)ではなく、pとすると、pが覚えている場所の数列が表示される。

#include <stdio.h>
main () {
        int a[5] = {1,2,3,4,5};
        int *p;
        int i;
        p = a; //配列の先頭ポインタを取得 p = &a[0]の省略形

        for (i = 0; i < 5; i++)
        {
                printf("%d\n",*(p+i));
                printf("%d\n",p+i);
        }
}

以下出力。iが1増加する毎になぜか4増加している。これは何故だろうか。

1        //for文中では*p+0
954535584      //for文中ではp+0
2              //for文中では*p+1
954535588      //for文中ではp+1
3              //for文中では*p+2
954535592      //for文中ではp+2
4              //for文中では*p+3
954535596      //for文中ではp+3
5              //for文中では*p+4
954535600      //for文中ではp+4

【追記】

ポインタ変数を定義するときは、

   char *p,  int *p

などと書き、1 ) ポインタ変数にアドレスを格納する際

   p = 文字列,  p = &変数, p = &a[i] または a (aが配列の場合) 

などと書く。2) ポインタ変数にそのものに値を格納する際は、

   *p = 文字列,  *p = 変数

などと書く。ポインタ自体はwindowsのショートカットのようなものであり、1)の行為はショートカット先を決める行為、2)の行為はショートカット開き変数を編集することに相当する。と理解した。

 【追記2】

&はアドレスを取得する演算子、*は中身を取得する演算子 である。