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

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

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

ポインタとは

 ポインタはC/C++言語の最も特徴的な機能といえるもので、ポインタ変数と呼ばれるもので操作する。ポインタ変数の配列を宣言することもできる。また、多次元配列のように、ポインタのポインタというものも存在する。

 このページをお読みいただいている読者にあっては、「C言語 ポインタ」「C++ ポインタ」などのキーワードでWeb検索をしたことがあるかもしれない。そうするとポインタに特化した内容の書籍をいくつか見つけられる。それだけ奥が深い機能ということである。

ポインタの用途

 では、ポインタはどんなところで使われているのだろう。C/C++言語では、main以外にあらかじめ利用可能になっている関数が多数存在するが、その一覧には、*(アスタリスクあるいはアステリスク)が書かれているものをよく見かける。

 これらはポインタ変数を表し、主に文字列の操作やファイルをはじめとするデータの入出力を行う関数において、ポインタの機能を利用することを表している。

ポインタ変数の宣言

 ポインタ変数の宣言では、一般の変数の場合とは異なり、名称の先頭に*がつけられる。以下はnというポインタ変数を宣言する例である。ここでは、*nが表す値のデータ型はintとなるが、それ以外のデータ型でポインタ変数を宣言すれば、*nはその型の値を表すことになる。

    int *n;    /* int型の値を表すポインタ変数nの宣言 */
    int n;     /* 一般の変数 n を宣言する場合 */

 続いて、*nを使って処理に用いる値を代入し、それを出力する例を示す。このときnには代入された値を記憶した場所(アドレス)が自動的に代入されるため、nそのものの値は実行されるごとに異なる可能性があるものの、*nが表す値は、処理中に変更されない限り5のままである。

    #include 

    int main( void ) {
      int *n;
      *n = 5;   /* ポインタ変数nに値5を代入 */
      printf( "%d\n", *n );  /* ポインタ変数nが持つ値(5)の出力 */
      return 0;
    }
  • 3件のコメント

#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さん、コメントありがとうございました。
著者の沖林さんからは、

「 ご指摘をいただいた賢明な読者の方々に感謝します。
表現が短絡的に過ぎ、結果として読者の方々に誤解を
与えてしまったのかもしれません。 」

とのコメントを頂きました。

また、沖林さんと編集部で相談し、記事を下記のように修正しました。

タイトル「C/C++のポインタの機能--参照渡し」

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

1ページ目
見出し「ポインタ変数の宣言」の個所

「ポインタ変数を宣言する例を以下に示す。一般の変数の場合とは異なり、名称の先頭に*がつけられる。このポインタ変数が持つ値のデータ型はintだが、それ以外のデータ型でポインタ変数を宣言することもできる。」

「ポインタ変数の宣言では、一般の変数の場合とは異なり、名称の先頭に*がつけられる。以下はnというポインタ変数を宣言する例である。ここでは、*nが表す値のデータ型はintとなるが、それ以外のデータ型でポインタ変数を宣言すれば、*nはその型の値を表すことになる。」

「ポインタ変数に値を代入し、それを出力する例を示す。*nは一般の変数と同じように用いることができるのがお分かりいただけるだろう。」

「*nを使って処理に用いる値を代入し、それを出力する例を示す。このときnには代入された値を記憶した場所(アドレス)が自動的に代入されるため、nそのものの値は実行されるごとに異なる可能性があるものの、*nが表す値は、処理中に変更されない限り5のままである。」

2ページ目
見出し「ポインタ変数の特徴」の個所

「2. 一般の変数を一時的にポインタ変数に変えることもできる」

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

見出し「1. 変数には複数の記述方法がある」の個所

「つまり、*nはアドレスを介してプログラムで用いる値を参照していることになる。そのため、このような処理を参照渡しという。」

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

「2. 一般の変数を一時的にポインタ変数に変えることもできる」

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

「このとき&nは、一般の変数nを一時的にポインタ変数に変えていることを表している。このようにすることで、一般の変数でも参照渡しをできるようにしているのだ。」

「この&nは、一般の変数nを用いて、その値が記憶されている場所(アドレス)を参照していることを表している。このときの&はアドレス演算子と呼ぶ。」


以上です。貴重なご意見、ありがとうございました。
今後もどしどしコメントを付けていただければ幸いです。
« サマリに戻る » 不適切なコメントを報告する
  • コメントをするにはCNET_IDログインが必要です
ログイン パスワードを忘れた方  |  新規登録
  • 今日のトップ記事
  • 昨日
  • 2日前
  • 3日前
  • 4日前
  • 7日前