C/C++ ポインタ入門 > ポインタの指す先を参照
Nobuhide Tsuda
Oct-2013
ポインタの指す先を参照
- ポインタは、なんらかのオブジェクトを指している
- 「*ポインタ名」でポインタの指している先を参照(読み出し・書き込み)することができるぞ。
- 「*」を付けてポインタの中身を取り出すことを「参照外し」または「参照はがし」って呼ぶんだぞ。
- この「*」を「間接演算子(dereference operator)」って呼ぶんだぞ
- ついでに言うと「char *prt;」のように、宣言時に記述する「*」は「ポインタ宣言子の*」と呼ぶようだ。
- 例えば「char *ptr = &c;」で宣言された「ptr」の指している先を参照するときは「*ptr」と記述するぞ
- 宣言時の「*ptr」とポイント先参照時の「*ptr」は、同じ記号を使っているが意味が別物
- これは初級者がよく混乱するところだ
- 宣言時の「T *ptr」の「*」はあくまでも型の一部だ。
- 前にも書いたが誤解を避けるために、慣れるまでは「T* ptr」と記述する方がよいかもしれない
- 右辺値として「*ptr」を記述した場合は、ptr の指すオブジェクトの値を返す
- 下記は、ptr が指している変数 x の値を取り出す例である
int x = 123;
int *ptr = &x; // ptr を宣言し、x のアドレスで初期化
std::cout << *ptr << "\n"; // ptr は x を指しているので、x の値が表示される
左辺値(代入演算子=の左側)として「*ptr」を記述した場合は、ポインタの指している先を上書きする
- 下記は、ptr が指している変数 x の値を上書きする例である
int x = 123;
int *ptr = &x; // ptr を宣言し、x のアドレスで初期化
*ptr = 456; // x の値を上書き
std::cout << x << "\n"; // x の値を表示
演習問題:
- 上記プログラムをビルド・実行し、x の値が書き換わっていることを確認しなさい
- int *src = &x; int *dst = &y; のとき、src, dst のみを使って、x の値を y に代入しなさい。
- int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int b[10]; があるとき、ポインタ int *src; int *dst; を使って、a[] の内容をすべて b[] にコピーしなさい。
ここまでのまとめ
- 「T *ptr = &変数;」 で型Tの変数を指すポインタを宣言・初期化できるぞ。
- 「*ptr」でポインタの指している先を参照(読み出し・書き込み)できるぞ。
- 読者の中には、「変数x を参照したいなら単に x を書けばいいんじゃね? わざわざポインタで指して、
間接的に参照するなんて面倒なだけじゃん。意味わかんね」と思われる人も少なくないと思う。
- たしかにその通りなのであるが、面倒にもかかわらずポインタが存在し、利用されて続けているのは、
それなりのメリットがあるからである。
- 具体的にどんなメリットがあるのかは、次章以降で説明する
前:ポインタの宣言・初期化
|上:C/C++ ポインタ入門
|次:ポインタの移動