C言語:ポインタ

C言語のポインタとは

C言語JAVAやその他の言語に比べて低級言語です。 ちなみに低級言語とは質の良し悪しではなくマシン語に近いかという意味です。

そのため、メモリ番地を意識したコードを書くことができます。 メモリ番地のことを「アドレス」といいます。そして、そのアドレスを指し示す変数のことをポインタ変数(以降、ポインタ)と言います。

ポインタの例

例えば、下記のようなものです。ポインタ変数「pVal」の宣言の書き方です。

   int *pVal;

変数「pVal」の手前に「*」がついています。これがポインタを意味する文字です。 pVal変数は「int型のポインタ変数」といいます。pValにはアドレスが格納できます。

ポインタ変数の使い方

まず、ポインタ変数を宣言しただけでは数値を代入できません。

   int *pVal;
   pVal = 10;   //コンパイルエラー

ポインタ変数の頭に「*」をつけるとポインタの示す変数になるんでしたね。では下記のようにしてみましょう。

   int *pVal;
   *pVal = 10;   //実行時エラー

うん、これだとエラーになります。理由は何でしょうか。

答えは、「ポインタ変数の先が無いから」です。早い話、pValはアドレス型ですが、まだ宣言しただけでpValには値が入っていません。よって、ちゃんと”int型のアドレス”を代入する必要があります。

  int *pVal;
  int. x = 0;
  pVal = &x; // 変数xのアドレスをpValに代入

  *pVal = 10;  //正常
  printf("x = %d¥n", x ); //画面に「x = 10」が表示される

  x = 50;
  printf("*pVal = %d¥n", *pVal ); //画面に「*pVal = 50」が表示される

変数の戦闘に「&」を付与すると変数が格納されたアドレスを意味します。 上記のように、変数xのアドレスをpValに代入すると、xとpValの先が同じアドレスになるため、*pValに値を代入すると、xの値が変化しますし、xに値を代入するとpValの指し示す先のint型の値が変わっています。

C言語のポインタは難しい?

確かにややこしいですが、ポインタを理解するとコンピュータのCPUの計算の動きがわかるようになります。 プログラマとしては損ではないと思いますよ。デバッグのときに重宝します。