C/C++のポインタの機能--参照渡しのような処理
ポインタは、それに特化した内容の書籍も発刊されているほど、C/C++言語の最も特徴的な機能だ。配列とも深い関係を持つその機能を紹介しよう。
ポインタ変数の特徴
ポインタ変数には、一般の変数とは異なる以下のような特徴がある。これらについて順に説明していきたい。
- 変数には複数の記述方法がある
- 一般の変数からもアドレスを参照できる
1. 変数には複数の記述方法がある
先ほどまで*nと記述してきたポインタ変数は、宣言以降はnという記述も許される。これが用いられるのは、たとえばキーボードなどから値を入力するときである。その例を以下に示す。
#includeint 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.で示した例は、一般の変数を用いて記述することもできる。その例を以下に示す。
#includeint main( void ) { int n; scanf( "%d", &n ); /* nの値をキーボードなどから入力(Enterで終了) */ printf( "%d\n", n ); /* nの値を出力 */ return 0; }
値が入力される変数をint n;と宣言したときは、scanf( ..., &n );と記述している。この&nは、一般の変数nを用いて、その値が記憶されている場所(アドレス)を参照していることを表している。このときの&はアドレス演算子と呼ぶ。
ポインタ変数と一般の変数が記述方法によってどのような値を表すのかを表1に示す。
ポインタ変数 | 一般の変数 | |
プログラムで用いる値 | *n | n |
記憶場所(アドレス) | n | &n |
ポインタには、この他にも特徴的な機能がある。そこで次回もポインタが持つ機能について説明を続けたい。
- 特集: C/C++のイロハ:メモリ管理からオブジェクト指向まで (15個の連載記事が公開中)
- 8件のコメント
#1 prometheus
- 2008/03/27 21:46:12
#3 tomita
- 2008/03/28 18:57:30
- 昨日のトップ記事
- 2日前
- 3日前
- 4日前
- 5日前
- ホワイトペーパー
-
デルスケーラブルアーキテクチャでMicrosoft Operations Manager(MOM)2005を使用した Microsoft SQL Server 2005 の管理
-
UPSシステム構成の比較
-
企業における情報セキュリティ実態調査
-
【導入事例】アポプラスステーション株式会社様:パソコンや携帯電話にメール情報を残さない利便性と安全性を兼ね備えたWebメールに統一
-
増え続けるファイルデータ。高まるデータ保護と事業継続への要求。データ可用性とデータ保護に優れ、かつコスト効率の高い分散型エンタープライズ環境を実現するためのヒントとは?
〜Brocade StorageXレプリケーション機能が可能にするリソース利用率の最適化とデータ保護
Power Center
- 話題のタグ