C/C++のポインタの機能--変数の場所(アドレス)
ポインタは、それに特化した内容の書籍も発刊されているほど、C/C++言語の最も特徴的な機能だ。配列とも深い関係を持つその機能を紹介しよう。
ポインタとは
ポインタはC/C++言語の特徴的な機能のひとつである。ポインタ(pointer)を直訳すると「指し示すもの」であり、別の変数や文字列定数の場所を指し示すために使う。また、ポインタを指すポインタ(ポインタへのポインタ)というものも存在する。
このページをお読みいただいている読者にあっては、「C言語 ポインタ」「C++ ポインタ」などのキーワードでWeb検索をしたことがあるかもしれない。そうするとポインタに特化した内容の書籍をいくつか見つけられる。それだけ奥が深い機能ということである。
ポインタの用途
では、ポインタはどんなところで使われているのだろう。C/C++言語では、あらかじめ定義されている関数が多数存在するが、その一覧には、*(アスタリスクあるいはアステリスク)が付いているものをよく見かける。
これらはポインタを表し、主に文字列の操作やファイルをはじめとするデータの入出力を行う関数において、ポインタの機能を利用することを表している。とくにC言語では呼び出し元の変数を変更する「参照呼出し」という機能がないため、C言語に由来する関数ではポインタを使用することが多い。
ポインタ変数の定義
ポインタ変数を定義するには、通常の型の場合とは異なり、型名の後ろに * がつけられる。以下はint(整数)型へのポインタとして、pという変数を定義する例である。ここでは、まずint型の変数nを定義する(初期値は5としておく)。nという変数の場所(アドレス)は&演算子(アドレス演算子)で取得できるので、これをpというポインタ変数の初期値として使っている。pのデータ型はint *、つまり整数値へのポインタ型となる。pが指し示す値は*を変数の直前につけて*pとすれば得られる。このときの、*pはint型である。pが指し示しているのは変数nの場所であり、ここでは、その場所にある値(変数nの中身)は5なので、*pは5になる。
ソースコード1
int n = 5; /* 通常の変数 n の定義(初期値は5) */
int *p = &n; /* ポインタ変数pの定義(初期値はnのアドレス) */
続いて、ポインタを使って値を代入する例を示す。このときpには変数nの場所(アドレス)が代入されているため、*p に値を代入することは、変数nの値を変更することと同じである。たとえば、次のように*pに10を代入すると、変数nの値が10になる。
ソースコード2
#include <stdio.h>
int main( void ) {
int n = 5;
int *p = &n;
*p = 10; /* ポインタ変数を使って値10を代入 */
printf( "%d\n", n ); /* 変数nの値を出力(10が表示される) */
return 0;
}
- コメント(25件)
#1 prometheus
- 2008/03/27 21:46:12
#2 mohno
- 2008/03/28 03:12:43
#3 tomita
- 2008/03/28 18:57:30
#4 tomita
- 2008/03/28 20:17:25
#5 επιστημη
- 2008/03/28 23:52:28
#6 επιστημη
- 2008/03/29 00:14:27
#7 Jitta
- 2008/03/29 07:27:04
#8 chaos
- 2008/03/29 10:39:50
#9 tomita
- 2008/03/30 12:52:17
#10 tomita
- 2008/03/30 12:57:13
#11 がる
- 2008/03/30 16:15:09
#12 Jitta
- 2008/03/30 22:07:07
#13 mrkn
- 2008/03/31 03:12:36
#14 chie65536
- 2008/04/01 13:40:24
#15 tomita
- 2008/04/01 15:23:46
#16 mrkn
- 2008/04/03 23:21:37
#17 tomita
- 2008/04/04 14:04:11
#18 しゃちょ
- 2008/04/04 15:42:14
#19 tomita
- 2008/04/04 20:02:21
#20 Murakami
- 2008/04/04 20:08:06
#21 Jitta
- 2008/04/08 22:52:05
#23 taken
- 2008/07/03 12:27:02
#24 tomita
- 2008/07/19 14:11:25
- 特集: C/C++のイロハ:メモリ管理からオブジェクト指向まで (15件)
- ホワイトペーパー
- 企画特集
御社のログ活用しませんか!?
仮想環境を実現するソリューション特集
そのストレージで仮想化に対応できますか?
◆エン・ジャパン厳選求人☆毎週更新◆
ロリポップ!がリニューアル
セキュリティ&ユーザ事例【SIer Club】
インターネット上の悪意を未然に防ぐには?
集積度も性能も、業界最高水準のブレードPC
SOA、BPM、SaaS −今、企業に必要なこと
ストレージメディア特設サイト開設
中小企業のセキュリティリスクとは?
パンデミック対策特集
今注目の「サジェスト検索」−デモ掲載中
ESBでIT投資の無駄を劇的に解消する
【徹底対談】運用管理ツールの賢い使い方
- ■ストレージ容量50%削減保証■
- エンタープライズにおけるSUSEの強み
- サービス・ドリヴン・データセンター
- サーバー監視・運用のコストを削減するには
- 話題のタグ
Windows 7はLinuxへの切替が簡単:注目の仮想ディスクフォーマット「VHD」
iPhone OS 3.0で変わった「絵文字」
OSSのクラウド基盤「Eucalyptus」を使う(4)--インストール〜ノード構築
俳優経験者が指南する「人前で上手く話すためのティップス10選」
「うるまでるびペイント」登場:絵は上手下手ではなく制作過程に楽しみが
待てば回路の日和あり--「iPhone 3GS」発売、しかし――