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個の連載記事が公開中)
- 3件のコメント
#1 prometheus
- 2008/03/27 21:46:12
#3 tomita
- 2008/03/28 18:57:30
- 今日のトップ記事
- 昨日
- 2日前
- 3日前
- 4日前
- 7日前
- ホワイトペーパー
-
サーバルームおよびデータセンタの電力密度仕様に関するガイドライン
-
分散型チームの生産性向上のために〜StarTeam の活用でソフトウェア開発効率を劇的に向上〜
-
バックアップ統合によるITオペレーションのコスト削減と非効率性の排除
-
アプリケーション性能低下の原因とその診断
-
分散化の進むオフィス環境においてファイル管理を効率化する方法 〜ファイル管理と移行のための最適なアプローチとは?
-
増え続けるファイルデータ。高まるデータ保護と事業継続への要求。データ可用性とデータ保護に優れ、かつコスト効率の高い分散型エンタープライズ環境を実現するためのヒントとは?
〜Brocade StorageXレプリケーション機能が可能にするリソース利用率の最適化とデータ保護
-
社内のセキュリティポリシーを社外にも適用する簡単・安全なリモートアクセス〜UNIVERGESecureBranch〜
-
あらゆる業務で利用可能な帳票開発・運用のベストソリューションCreate!Form
-
新たなBIソリューション:テキストマイニングTRUE TELLERで定性情報を“見える化”する
-
大成建設(株)「営業に生かす」FatWire CMS事例
Power Center
- 話題のタグ