ポインタ
ポインタは変数の「アドレス」を記録する変数です。
- ポインタ変数には、「メモリ上での変数の位置(場所)」が格納されます。
- ポインタ参照演算子で、ポインタから「それが指し示す変数の値」を取得できます。
これを利用して、変数に別名をつけることができます。また、引数を参照渡しすることで、関数内で呼び出し元関数の変数そのものを共有できます。
宣言
ポインタの宣言は次のとおり。「*」をつけます。
<型> *<変数名>;
アドレスの代入
アドレス演算子「&」で変数のアドレスを取得できます。
参照
ポインタ参照演算子「*」で「それが指し示す変数の値」を取得します。
#include <iostream> int main() { int a = 100; // ポインタ変数の宣言 int *pointer; // ポインタ変数にアドレスを代入/アドレス演算子「&」を使う。 pointer = &a; // ポインタの値の参照/ポインタ参照演算子「*」を使う。 std::cout << *pointer << std::endl; // 100 // ポインタにはアドレスが挿入されている。 std::cout << pointer << std::endl; // 変数aのアドレス。毎回異なる。 return 0; }
実行結果です。
100 0xbff3cfa4
引数をポインタで渡す。
引数をポインタで渡すと、呼び出し元関数内の変数を、呼び出した関数から参照することができます。
#include <iostream> // int を受け取る関数。 void addInt( int i ) { std::cout << i << std::endl; i++; std::cout << i << std::endl; } // int のポインタを受け取る関数。 void addPointer( int *i ) { std::cout << *i << std::endl; (*i)++; // 「*」より「++」のほうが優先されるので注意 std::cout << *i << std::endl; } int main() { int a = 100; // 値を普通に渡す。 / 関数内での変数値の変更は、ローカル変数aに影響しない。 addInt(a); std::cout << a << std::endl; std::cout << std::endl; // 値を参照渡し。 / 関数内での変数値の変更が、ローカル変数aに影響する。 addPointer(&a); std::cout << a << std::endl; return 0; }
実行結果です。
100 101 100 100 101 101
次のように書くと、引数で渡されたポインタを通常の変数のように利用することができます。
#include <iostream> // 引数に&を付けると、ポインタの値を参照する際に*をつけなくも良い。 void addPointer( int &i ) { std::cout << i << std::endl; i++; std::cout << i << std::endl; } int main() { int a = 100; addPointer(a); // 呼び出し時も変数を直接渡す。 std::cout << a << std::endl; return 0; }
実行結果です。
100 101 101