前言#
小技巧を記録して、基礎知識を確認しやすくする。
1. 参照 &,ポインタ *,アドレス演算子 &#
参照 & は C++ の新しい概念です。
アドレス演算子 & は、変数のアドレス情報を取得します。
ポインタはメモリの一部を指し示し、その内容は指し示すメモリのアドレスです。参照はメモリの別名です。
参照は定義時に初期化され、一度しか初期化できません。その後は変更できません。ポインタは変更可能です。
参照は空にできませんが、ポインタは空にできます。
以下は「値渡し」の例です。Func1 関数の本体内の x は外部変数 n のコピーです。x の値を変更しても n に影響を与えませんので、n の値は 0 のままです。
void Func1(int x)
{
x = x+10;
}
int n = 0;
Func1(n);
cout << "n=" << n << endl;
//出力: n = 0
以下は「ポインタ渡し」の例です。Func2 関数の本体内の x は外部変数 n を指すポインタです。このポインタの内容を変更すると、n の値も変更されますので、n の値は 10 になります。
void Func2(int* x)
{
(*x) = (*x) + 10; // *はポインタを解除する役割を持ち、x自体はnのアドレス情報を表します。
}
int n = 0;
Func2(&n);//ここで&はアドレス演算子です
cout<<"n="<<n<<endl;
//出力: n=10
以下は「参照渡し」の例です。Func3 関数の本体内の x は外部変数 n の参照です。x と n は同じものであり、x を変更することは n を変更することと同じですので、n の値は 10 になります。
void Func3(int &x)
{
x = x+10;
}
int n = 0;
Func3(n);
cout<<"n="<<n<<endl;
//出力: n=10
ポインタは別のオブジェクトを指すように再代入することができます。参照は初期化時に指定されたオブジェクトを常に指します。
string s1("Nancy");
string s2("Clancy");
string& rs = s1; // rsはs1を参照します
string *ps = &s1; // psはs1を指します
rs = s2; // rsはまだs1を参照していますが、s1の値は「Clancy」になりました
ps = &s2; // psは今やs2を指します
2. 矢印(->)とドット(.)演算子#
構造体やクラスの場合、オブジェクトをポインタで定義する場合は、「->」を使用してクラスのメンバーや構造体の要素を指します。
一般的なオブジェクトを定義する場合は、「.」を使用してクラスのメンバーや構造体の要素を指します。
構造体の場合:
struct MyStruct
{
int member_a;
};
MyStruct s;
s.member_a = 1;
MtStruct *ps;
(*ps).member_a = 1;
ps->member_a = 2;
クラスの場合:
class A
{
public
play();
}
A *p;
p->play();
A p;
p.play();