C/C++のポインタの機能--変数の場所(アドレス)

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

ポインタは、それに特化した内容の書籍も発刊されているほど、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

>ポインタ変数に値を代入し、それを出力する例を示す  ポインタnはどこを指しているのでしょうか?
» 不適切なコメントを報告する

#2 mohno  - 2008/03/28 03:12

すでに指摘されていますが、筆者の方はポインタを理解されていないと思います。 「参照渡し」も実際にはポインタを値で渡しているので... 続きを見る
» 不適切なコメントを報告する

#3 tomita  - 2008/03/28 18:57

builder編集部 冨田です。 prometheusさん、mohnoさん、コメントありがとうございました。 著者の沖林さんからは、 「 ご指摘を... 続きを見る
» 不適切なコメントを報告する

#4 tomita  - 2008/03/28 20:17

著者の沖林さんから読者の皆様へメッセージが届いております。 「賢明な読者の方々に対し、まずは感謝の意を表します。 ご指摘を元... 続きを見る
» 不適切なコメントを報告する

#5 επιστημη  - 2008/03/28 23:52

文面はともかくも、最初のコード:   int *n;  *n = 5; /* ポインタ変数nに値5を代入 */ これをなんとかしないと。 とて... 続きを見る
» 不適切なコメントを報告する

#6 επιστημη  - 2008/03/29 00:14

[2page冒頭] >  プログラム内で用いる値は*nでを示しているのだが、nが示しているのは、 > その値を記憶させるメモリ上のアドレスだ... 続きを見る
» 不適切なコメントを報告する

#7 Jitta  - 2008/03/29 07:27

まず、ポインタ変数がなぜ必要なのか。Java や C# では取っ払ってしまったポインタ変数とはなんぞや?そこが必要ではないでしょうか。 ... 続きを見る
» 不適切なコメントを報告する

#8 chaos  - 2008/03/29 10:39

ん〜...この20年で、最低最悪のポインタの説明だ... ・すでにポインタがわかっている/わかっているつもりの人が、この記事の間... 続きを見る
» 不適切なコメントを報告する

#9 tomita  - 2008/03/30 12:52

builder編集部 冨田です。 1ページ目 最下段のソースですが、下記(1)のように記述しておりました。 しかしこれ、「」を文字実体参照... 続きを見る
» 不適切なコメントを報告する

#10 tomita  - 2008/03/30 12:57

同じく2ページ目のソース2点についても、上記と同様のミスがありました。 最初のソースの修正前(1)、修正後(2)、2番目のソースの修正前... 続きを見る
» 不適切なコメントを報告する

#11 がる  - 2008/03/30 16:15

がると申します。 んと…修正した後もなおおかしいソースのまま、というのは、非常に好ましくないと思うのうですが。 最低限、付記よう... 続きを見る
» 不適切なコメントを報告する

#12 Jitta  - 2008/03/30 22:07

ポインタ変数として宣言すると言うことは、「この変数は、入れ物のありかを示しますよ」という宣言をするということです。従って、 「 ... 続きを見る
» 不適切なコメントを報告する

#13 mrkn  - 2008/03/31 03:12

επιστημη さんもご指摘されていることですが, int *n; *n = 5; このようなコードが何故なんのチェックもされないまま公開されている... 続きを見る
» 不適切なコメントを報告する

#14 chie65536  - 2008/04/01 13:40

この筆者は「ポインタ変数は、宣言したら、すぐに参照に使える。そのポインタがどこを指してても構わない」と思っているに違いない。 ... 続きを見る
» 不適切なコメントを報告する

#15 tomita  - 2008/04/01 15:23

builder編集部 冨田です。 4月1日 15時に本稿の1ページ目を修正しました。修正個所は下記の通りです。 タイトル 「C/C++のポインタ... 続きを見る
» 不適切なコメントを報告する

#16 mrkn  - 2008/04/03 23:21

そろそろ2ページ目が修正されても良い頃だと思うんですが,いったい何時になったら修正されるんですか? まさか,このまま修正せず,こ... 続きを見る
» 不適切なコメントを報告する

#17 tomita  - 2008/04/04 14:04

builder編集部 冨田です。 4月4日 14時に本稿の2ページ目を修正しました。修正個所は下記の通りです。 見出し「ポインタ変数の特徴... 続きを見る
» 不適切なコメントを報告する

#18 しゃちょ  - 2008/04/04 15:42

勘違いや誤りは誰にもありますが、記事の品質確保の手段(例えばレビュー)は確保されているのでしょうか?そうした手段がないとしたら、... 続きを見る
» 不適切なコメントを報告する

#19 tomita  - 2008/04/04 20:02

Murakamiさん builder編集部の冨田です。コメントありがとうございます。 ご指摘の通りです。修正しました。
» 不適切なコメントを報告する

#20 Murakami  - 2008/04/04 20:08

冨田さま。 操作ミスで私のコメントを消してしまいました。 流れが判らなくなってしまうといけないので 再掲いたします。 ↓ここ... 続きを見る
» 不適切なコメントを報告する

#21 Jitta  - 2008/04/08 22:52

2ページ目、ソースコード3の下、 「つまり、*nはアドレスを介して…」→「つまり、*pはアドレスを介して…」 単純だが重要なタイプミス。... 続きを見る
» 不適切なコメントを報告する

#22 επιστημη  - 2008/04/25 00:14

...で、いつまで「修正中」にしとくのかしら。
» 不適切なコメントを報告する

#23 taken  - 2008/07/03 12:27

いつのまにか、「修正中」が消えているようですが、記事は変わっていないようなので。 重箱の隅のようですみません。 「つまり、*n... 続きを見る
» 不適切なコメントを報告する

#24 tomita  - 2008/07/19 14:11

taken様 builder編集部 冨田です。いつもご愛読頂きありがとうございます。 また、以前からご指摘頂いていた点について、修正に反映... 続きを見る
» 不適切なコメントを報告する
記事に関係する情報をコメントでお寄せください

ニックネーム : CNET_IDにログインしてコメントする

コメント本文(必須) :
  • 新着記事
  • 人気記事
  • 特集
  • ブログ