あなたはそう、[OK]を:)非常に混乱しているようだん:ポインタが別の変数のアドレスを格納するだけの変数であり、基本的に
。例えば、私はi
と呼ばれるint
があると、私はポインタp
にそのアドレスを格納することができます:私は、それは(つまり、そのアドレスは、それが格納する変数)を指すものを変更したい場合は
int i = 23;
int *p = &i; // p has type int* (pointer to int) and stores &i (the address of i)
、Iちょうど*p
に割り当ててください - これは指示されたことを示すのに使用される構文です。この場合、*p
はi
を指します。したがって:
*p = 9; // sets i to 9 (since *p is i)
私はすなわち
int j = 84;
p = &j; // store j's address in p, overwriting what was there before (i.e. i's address)
*p = 18; // sets j to 18 (since *p is now j)
今、参照がわずかに異なっている、(すなわち、それは何か他のものを指して作る)ポインタを取り付け直しだけp
に割り当てることができます。
int i = 23;
int& r = i; // r has type int& (reference to int) and refers to i
注(コンパイラは物事を最適化開始特にとき、またはそれらがない場合もある)、それはプログラミングの観点から無関係だ参照はポインタの点でをを実施することができること:参照変数のエイリアスを作成します - ここで私たちにとって重要なのは、言語の仕組みです。
この場合、i
)は、あなただけの操作を行います。
r = 9; // sets i to 9 (since r is an alias for i)
ポインタとは異なり、参照がを取り付け直すことはできません。上に示したように、r
に代入すると、参照自体ではなく、(i
)を参照しているものが変更されます。さらに、参照を再配置することはできないため、参照を直ちに初期化する必要があります。ポインタの場合はそうではありません。言い換えれば:
int *p; // legal
int& r; // bad
最後にもう一つの基本的な違いは、ポインタは、彼らが何を指していないことを示す、NULL
することができることです。これは単にアドレス0
を含むことを意味します。参照は常に実際のオブジェクトを参照する必要があります。ポインタがNULL
でない場合は、ポインターを使用してMaybe型を実装することができ、そうでない場合は別の処理を行うため、この違いが実装者にとって重要になります。彼らは参照で同じことをすることはできません。
ポインタと参照の関係は明らかです。今
、あなたのoperator+
- 加算演算子の目的は、2つのオブジェクトを追加し、その合計を表す新しいオブジェクトを返すことです。私は2次元ベクトル型を持っていたのであれば、私はそれのためにoperator+
を書くかもしれません、次のように:あなたのコードで
Vec2 operator+(const Vec2& lhs, const Vec2& rhs)
{
return Vec2(lhs.x+rhs.x, lhs.y+rhs.y);
}
を、あなたは参照することにより、ローカルオブジェクトtoreturn
を返すようにしようとしている - これは動作しません、なぜならオペレータの最後にはtoreturn
が存在しなくなります。代わりにここで価値あるものに戻ってください。ちなみに、ポインタを返そうとした場合、同じ問題が発生します。そのコードで
Vec2* operator+(const Vec2& lhs, const Vec2& rhs)
{
Vec2 result(lhs.x+rhs.x, lhs.y+rhs.y);
return &result; // bad!
}
、result
は、オペレータの端部に存在しなくなるので、あなたは、戻りポインタが無効な場所を指してしまうことになります。ボトムライン - このような状況では価値あるものに戻りましょう。
http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-cあなたの場合、参照はエイリアスであり、いくつかのアドレスを参照しています。しかし、ローカルで作成された 'toreturn'を参照してから、' toreturn'の有効期間が終了しても関数の復帰時に参照を返そうとします。 – birryree
あなたは常に 'static'を返すことができますが、それは良い考えではないようです... – erjot