2

*param1 と ¶m2 を扱う C 関数呼び出しを見たことがあります。

   func1(*param1);

   func2(&param2);

* と & はポインターと関係があることを知っています。では、これら 2 つの異なる方法を使用する目的は何でしょうか? それぞれの利点はありますか?

4

4 に答える 4

7
func1(*param1);

この場合、ポインターが指すアドレスの内容をparam1function に渡していますfunc1

func2(&param2);

この場合、 のアドレスを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。スターは、変数の定義中は異なる意味を持ちます。ポインターを逆参照するのではなく、ポインターを定義するために使用されます。確かに初心者には少し混乱します....

于 2013-05-31T18:44:34.303 に答える
4

*はこのコンテキストの逆参照演算子であり、一方&は参照演算子です。たとえば、 と の 2 つの変数があるとint *aしますint baは何らかの整数値へのポインタですが、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同じ値を指しているので問題ありません。したがって、逆参照演算子でを変更すると、値はある意味で「グローバルに」変更されます。したがって、同じ値へのポインターを持つ人は誰でも変更を確認できます。

于 2013-05-31T18:47:34.413 に答える
4

*param1ポインターを逆参照していると言うとき。したがって、param1が整数へのポインタである場合1、基本的には と言っていfunc1(1)ます。

&param2のアドレスをparam2関数に渡していると言うとき。したがって、基本的にはへのポインタを渡していますparam2

于 2013-05-31T18:44:47.950 に答える
3

これは基本的な C です。

  • * ポインタを逆参照し、ポインタに格納されているメモリ アドレスに移動し、ポインタの宣言された型に基づいてメモリを評価します。例: int へのポインターは、逆参照されると、整数値を提供します。
  • & 変数が格納されているメモリ アドレスを取得します。このアドレスはポインタ変数に格納できます。
于 2013-05-31T18:47:58.747 に答える