*param1 と ¶m2 を扱う C 関数呼び出しを見たことがあります。
func1(*param1);
func2(¶m2);
* と & はポインターと関係があることを知っています。では、これら 2 つの異なる方法を使用する目的は何でしょうか? それぞれの利点はありますか?
func1(*param1);
この場合、ポインターが指すアドレスの内容をparam1
function に渡していますfunc1
。
func2(¶m2);
この場合、 のアドレスをparam2
関数に渡していますfunc2
。
要するに、2 番目は新しいポインターを作成し (つまり、「あそこを見てください!」)、1 番目はポインターが何を指しているかを示します (つまり、「このボックスには何が入っていますか?」)。
ポイントを家に追いやるために、実際には役に立たない例を次に示します。
int x = 1234; /* an example value */
int *y = &x; /* The pointer y now points at x (or the memory location in which x resides). */
int z = *y; /* z is now = 1234 - it looked at what y was pointing at and took that value. */
int w = *(&x); /* w is now = 1234 - I created a temporary pointer and then immediately dereferenced it. */
また、ポインターの定義にも注意してくださいint *y
。スターは、変数の定義中は異なる意味を持ちます。ポインターを逆参照するのではなく、ポインターを定義するために使用されます。確かに初心者には少し混乱します....
*
はこのコンテキストの逆参照演算子であり、一方&
は参照演算子です。たとえば、 と の 2 つの変数があるとint *a
しますint b
。a
は何らかの整数値へのポインタですが、b 自体は整数値です。たとえば、次のようになります。
func(a) // Pass a copy of a, which points to the same value as a.
func(*a) // Pass a copy of the value a points to.
func(b) // Pass a copy of b.
func(&b) // Pass a pointer which points to b.
追加の注意事項の 1 つは、関数が次のように定義されている場合、C & 演算子を C++ の ,と混同しないことvoid func(const std::string &s)
です。
ある方法が他の方法よりも優れているという点については、私は実際に 1 つがあるとは言いません。それは、関数が何をする必要があるかによって異なります。何らかの整数を受け取り、それを変更する modifyNumber() という関数を作成し、呼び出し元がその変更を確認できるようにしたいとします。
値が C の関数に渡されるたびに、値がコピーされます。つまり、modifyNumber() 関数を次のように定義した場合:
modifyNumber(int i)
{
i = 5;
}
の値は変更されますが、のコピーi
のみが変更されます。関数を呼び出したコードにも変更を反映させたい場合は、次のようにする必要があります。i
modifyNumber(int *i)
{
*i = 5;
}
// Elsewhere in the code...
int i = 1;
modifyNumber(&i);
// Now i == 5.
この場合、コピーされる変数へのポインターを渡していますが、それでもi
同じ値を指しているので問題ありません。したがって、逆参照演算子で値を変更すると、値はある意味で「グローバルに」変更されます。したがって、同じ値へのポインターを持つ人は誰でも変更を確認できます。
*param1
ポインターを逆参照していると言うとき。したがって、param1
が整数へのポインタである場合1
、基本的には と言っていfunc1(1)
ます。
¶m2
のアドレスをparam2
関数に渡していると言うとき。したがって、基本的にはへのポインタを渡していますparam2
。
これは基本的な C です。
*
ポインタを逆参照し、ポインタに格納されているメモリ アドレスに移動し、ポインタの宣言された型に基づいてメモリを評価します。例: int へのポインターは、逆参照されると、整数値を提供します。&
変数が格納されているメモリ アドレスを取得します。このアドレスはポインタ変数に格納できます。