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

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

ポインタは、それに特化した内容の書籍も発刊されているほど、C/C++言語の最も特徴的な機能だ。配列とも深い関係を持つその機能を紹介しよう。

ポインタ変数の特徴

 ポインタ変数には、一般の変数とは異なる以下のような特徴がある。これらについて順に説明していきたい。

  1. ポインタ変数の宣言には変数名の前に*をつける
  2. 一般の変数もアドレス演算子を利用してアドレスを参照できる

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に示す。

表1 変数の記述方法
 ポインタ変数一般の変数
プログラムで用いる値*nn
記憶場所(アドレス)n&n

 ポインタには、この他にも特徴的な機能がある。そこで次回もポインタが持つ機能について説明を続けたい。

  • コメント(23件)

#1 prometheus  - 2008/03/27 21:46:12

>ポインタ変数に値を代入し、それを出力する例を示す  ポインタnはど... 続きを見る
» 不適切なコメントを報告する

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

すでに指摘されていますが、筆者の方はポインタを理解されていないと思... 続きを見る
» 不適切なコメントを報告する

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

builder編集部 冨田です。 prometheusさん、mohnoさん、コメントあり... 続きを見る
» 不適切なコメントを報告する

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

著者の沖林さんから読者の皆様へメッセージが届いております。 「賢... 続きを見る
» 不適切なコメントを報告する

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

文面はともかくも、最初のコード:   int *n;  *n = 5; /* ... 続きを見る
» 不適切なコメントを報告する

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

[2page冒頭] >  プログラム内で用いる値は*nでを示しているのだが、n... 続きを見る
» 不適切なコメントを報告する

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

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

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

ん〜...この20年で、最低最悪のポインタの説明だ... ・すでに... 続きを見る
» 不適切なコメントを報告する

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

builder編集部 冨田です。 1ページ目 最下段のソースですが、下記(1)... 続きを見る
» 不適切なコメントを報告する

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

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

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

がると申します。 んと…修正した後もなおおかしいソースのまま、という... 続きを見る
» 不適切なコメントを報告する

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

ポインタ変数として宣言すると言うことは、「この変数は、入れ物のあり... 続きを見る
» 不適切なコメントを報告する

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

επιστημη さんもご指摘されていることですが, int *n; *n = 5; この... 続きを見る
» 不適切なコメントを報告する

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

この筆者は「ポインタ変数は、宣言したら、すぐに参照に使える。そのポ... 続きを見る
» 不適切なコメントを報告する

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

builder編集部 冨田です。 4月1日 15時に本稿の1ページ目を修正しまし... 続きを見る
» 不適切なコメントを報告する

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

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

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

builder編集部 冨田です。 4月4日 14時に本稿の2ページ目を修正しまし... 続きを見る
» 不適切なコメントを報告する

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

勘違いや誤りは誰にもありますが、記事の品質確保の手段(例えばレビュー... 続きを見る
» 不適切なコメントを報告する

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

Murakamiさん builder編集部の冨田です。コメントありがとうございま... 続きを見る
» 不適切なコメントを報告する

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

冨田さま。 操作ミスで私のコメントを消してしまいました。 流れが... 続きを見る
» 不適切なコメントを報告する

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

2ページ目、ソースコード3の下、 「つまり、*nはアドレスを介して…」→... 続きを見る
» 不適切なコメントを報告する

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

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

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

いつのまにか、「修正中」が消えているようですが、記事は変わっていな... 続きを見る
» 不適切なコメントを報告する
記事の感想やご意見をコメントでお寄せください(CNET_IDログインが必要です)
ログイン パスワードを忘れた方  |  新規登録
  • 新着記事
  • 人気記事
  • 特集
  • ブログ
  • 読者投票
    今、使っているマシンのOSは?

    投票受付期間:2008年6月27日 〜 2008年7月11日
  • » 投票しないで結果だけ見る