C/C++のポインタの機能--変数の場所(アドレス)
沖林正紀
2008/03/27 17:00
ポインタは、それに特化した内容の書籍も発刊されているほど、C/C++言語の最も特徴的な機能だ。配列とも深い関係を持つその機能を紹介しよう。
ポインタ変数の特徴
ポインタ変数には、一般の変数とは異なる以下のような特徴がある。これらについて順に説明していきたい。
- ポインタ変数の宣言には変数名の前に*をつける
- 一般の変数もアドレス演算子を利用してアドレスを参照できる
1. ポインタ変数の宣言には変数名の前に*をつける
*pと記述してポインタ変数を宣言すると、メモリ上にポインタ変数が確保される。pと記述した場合にはアドレス自体を指し、*pとした場合はアドレスが指し示す値を参照することになる。
※宣言だけではポインタ変数は初期化されず、どういったアドレスが格納されるのか不定。
ソースコード3
#include <stdio.h>
int main( void ) {
int *p;
int n = 0;
p = &n; /* ポインタ変数を変数mのアドレスで初期化 */
printf( "%d\n", n); /* 0が出力*/
printf( "%d\n", *p); /* 0が出力 */
scanf( "%d", p ); /* キーボードなどから入力(Enterで終了) */
printf( "%d\n", n); /* 標準入力から入力された数値が出力される。*/
printf( "%d\n", *p); /* 標準入力から入力された数値が出力される。*/
return 0;
}
*pはポインタ変数pが指し示すアドレスにある値を示す。しかし、scanf関数で値を入力する際、どこに記憶させるのかは、あらかじめ知らせておかなくてはならない。そこで、宣言後に、変数nのアドレスをポインタ変数pに設定し、入力された値の記憶場所を知らせているわけだ。
つまり、*nはアドレスを介してプログラムで用いる値を参照していることになる。C/C++においては、このようにアドレスの値を用いることで、JavaやVBにおける参照渡しのように機能させることができるようになっている。
2. 一般の変数もアドレス演算子を利用してアドレスを参照できる
1.で示した例は、一般の変数だけを用いて記述することもできる。その例を以下に示す。
ソースコード4
#include <stdio.h>
int 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 |
ポインタには、この他にも特徴的な機能がある。そこで次回もポインタが持つ機能について説明を続けたい。
- コメント(23件)
#1 prometheus
- 2008/03/27 21:46:12
>ポインタ変数に値を代入し、それを出力する例を示す
ポインタnはど... 続きを見る
» 不適切なコメントを報告する
#3 tomita
- 2008/03/28 18:57:30
builder編集部 冨田です。
prometheusさん、mohnoさん、コメントあり... 続きを見る
» 不適切なコメントを報告する
#13 mrkn
- 2008/03/31 03:12:36
επιστημη さんもご指摘されていることですが,
int *n;
*n = 5;
この... 続きを見る
» 不適切なコメントを報告する
- 特集: C/C++のイロハ:メモリ管理からオブジェクト指向まで (15件)
- 2日前のトップ記事
- 4日前
- 5日前
- 6日前
- 7日前
- ホワイトペーパー
- 読者投票
今、使っているマシンのOSは?
- 話題のタグ
iPhone
オープンソース
Safari
フレームワーク
Eclipse
PHP
ライブラリ
Firefox
JavaScript
Opera
Linux
XHTML
Solaris
リファレンス
Java
Webデザイン
小技
C/C++
Mozilla
iPod touch
Webアプリケーション開発
CSS
Apache
ブラウザ
Microsoft
開発環境
Flash
仮想化
Ajax
Mac OS X
Leopard
Firefox 3
Windows
Tips
MySQL
Internet Explorer
入門
Off Topic
server
Google
HTML
Apple
iPhone 3G
Ruby
Database
SOA
Python
Adobe
RIA
イロハ
話題のタグを見る »
フォトレポート:世界各国の優秀な技術者がパリに集結--Imagine Cup 2008世界大会
バッチ処理でデータベース活用:4つの課題と5つの解決ポイント
Rubyでどう書く?:RubyでWord文書を作成する
Adobe Acrobat 9--音声やクイズを埋め込んでeラーニング
ウェブ制作者が仲間と幸せに仕事をする方法:仲間との出会い
Excelで多用する雑多な操作を素早く片付けるための10のティップス(前編)
開発者のFirefox 3:非互換のアドオンをインストール
DELL連載第4回〜「Microsoft System Center」
今知るべき仮想化情報
Techno Exchange
「未来の、その先」をどう提言していくか
ZDNet Japan Green IT