C/C++のポインタの機能--参照渡しのような処理

沖林正紀
2008/03/27 17:00

ポインタは、それに特化した内容の書籍も発刊されているほど、C/C++言語の最も特徴的な機能だ。配列とも深い関係を持つその機能を紹介しよう。

ポインタ変数の特徴

 ポインタ変数には、一般の変数とは異なる以下のような特徴がある。これらについて順に説明していきたい。

  1. 変数には複数の記述方法がある
  2. 一般の変数からもアドレスを参照できる

1. 変数には複数の記述方法がある

 先ほどまで*nと記述してきたポインタ変数は、宣言以降はnという記述も許される。これが用いられるのは、たとえばキーボードなどから値を入力するときである。その例を以下に示す。

    #include 

    int main( void ) {
      int *n;
      scanf( "%d", n );      /* *nの値をキーボードなどから入力(Enterで終了) */
      printf( "%d\n", *n );  /* nの値を出力 */
      return 0;
    }

 値が入力される前は、*nには値が設定されていない。しかしscanf()の後は*nに値が設定されている。このように、関数によって*nの値が変更されるときに、nのような記述が行われる。

 プログラム内で用いる値は*nでを示しているのだが、nが示しているのは、その値を記憶させるメモリ上のアドレスだ。それ自体は自動的に設定されるため、開発者が具体的なアドレスを設定する必要はない。

 しかし、プログラム内でscanf関数に値を入力してもらうときに、その値をどこに記憶させるのかはあらかじめ知らせておかなくてはならない。そこで、宣言時に具体的なアドレスが設定されているnを使って、入力された値の記憶場所を知らせているわけだ。

 つまり、*nはアドレスを介してプログラムで用いる値を参照していることになる。C/C++においては、このようにアドレスの値を用いることで、参照渡しのように機能させることができるようになっている。

2. 一般の変数からもアドレスを参照できる

 1.で示した例は、一般の変数を用いて記述することもできる。その例を以下に示す。

    #include 

    int main( void ) {
      int n;
      scanf( "%d", &n );     /* nの値をキーボードなどから入力(Enterで終了) */
      printf( "%d\n", n );   /* nの値を出力 */
      return 0;
    }

 値が入力される変数をint n;と宣言したときは、scanf( ..., &n );と記述している。この&nは、一般の変数nを用いて、その値が記憶されている場所(アドレス)を参照していることを表している。このときの&はアドレス演算子と呼ぶ。

 ポインタ変数と一般の変数が記述方法によってどのような値を表すのかを表1に示す。

表1 変数の記述方法
 ポインタ変数一般の変数
プログラムで用いる値*nn
記憶場所(アドレス)n&n

 ポインタには、この他にも特徴的な機能がある。そこで次回もポインタが持つ機能について説明を続けたい。

  • 8件のコメント

#1 prometheus  - 2008/03/27 21:46:12

>ポインタ変数に値を代入し、それを出力する例を示す  ポインタnはど... 続きを見る
» 不適切なコメントを報告する

#2 mohno  - 2008/03/28 03:12:43

すでに指摘されていますが、筆者の方はポインタを理解されていないと思... 続きを見る
» 不適切なコメントを報告する

#3 tomita  - 2008/03/28 18:57:30

builder編集部 冨田です。 prometheusさん、mohnoさん、コメントあり... 続きを見る
» 不適切なコメントを報告する

#4 tomita  - 2008/03/28 20:17:25

著者の沖林さんから読者の皆様へメッセージが届いております。 「賢... 続きを見る
» 不適切なコメントを報告する

#5 επιστημη  - 2008/03/28 23:52:28

文面はともかくも、最初のコード:   int *n;  *n = 5; /* ... 続きを見る
» 不適切なコメントを報告する

#6 επιστημη  - 2008/03/29 00:14:27

[2page冒頭] >  プログラム内で用いる値は*nでを示しているのだが、n... 続きを見る
» 不適切なコメントを報告する

#7 Jitta  - 2008/03/29 07:27:04

まず、ポインタ変数がなぜ必要なのか。Java や C# では取っ払ってしまっ... 続きを見る
» 不適切なコメントを報告する

#8 chaos  - 2008/03/29 10:39:50

ん〜...この20年で、最低最悪のポインタの説明だ... ・すでに... 続きを見る
» 不適切なコメントを報告する
  • コメントをするにはCNET_IDログインが必要です
ログイン パスワードを忘れた方  |  新規登録