41

C++でポインタ引数を渡し、値で渡しますか? ポインター自体への変更は、メソッドの外部には反映されないことがわかります。ただし、ポインターを逆参照することで行った変更は反映されます。

その場合、ポインタへのポインタを関数への引数として使用して、関数内でポインタ値をそのまま変更することは許容/標準的な手順ですか?

4

5 に答える 5

51

はい、両方に。

ポインターは、他のものと同様に値によって渡されます。つまり、ポインター変数の内容 (指しているオブジェクトのアドレス) がコピーされます。つまり、関数本体でポインターの値を変更しても、その変更は、まだ古いオブジェクトを指している外部ポインターには反映されません。ただし、指しているオブジェクトの値は変更できます。

ポインターに加えられた変更を外部ポインターに反映する (別のものを指すようにする) 場合は、2 レベルの間接化 (ポインターからポインター) が必要です。関数を呼び出すとき&は、ポインターの名前の前に a を付けます。これは標準的な C のやり方です。

C++ を使用する場合は、ポインターよりも参照を使用することをお勧めします (以降、ポインターからポインターへの参照も優先されます)。

ポインターよりも参照を優先する理由には、いくつかの理由があります

  • 参照は、関数本体のポインターよりも構文ノイズが少ない
  • 参照は、ポインターよりも多くの情報を保持します。これは、コンパイラーに役立つ可能性があります。

参照の欠点は主に次のとおりです。

  • それらは C の単純な値渡しルールを破っています。パラメータに関する関数の動作の理解 (パラメータは変更されますか?) がわかりにくくなっています。確かに関数プロトタイプも必要です。しかし、これは、C を使用するときに必要な複数のポインター レベルよりも実際には悪いことではありません。
  • これらは C ではサポートされていません。これは、C と C++ の両方のプログラムで動作するコードを作成する場合に問題になる可能性があります (ただし、これは最も一般的なケースではありません)。

ポインターからポインターへの特定のケースでは、違いはほとんど単純ですが、参照を使用すると、ポインターの両方のレベルを削除して、ポインターからポインターの代わりに 1 つの参照のみを渡すことも簡単になる場合があります。

于 2010-12-13T07:05:32.467 に答える
13

ここで混乱を理解しています。「値渡し」と「参照渡し」の概念は、そのように見えてもあまり明確ではありません。コンピュータはこれらの概念を認識しておらず、それに従って動作しないことに注意してください。コンピューターは型を認識しません。したがって、ポインターと値を区別しません。例を挙げて説明してみましょう:

void func1(int x) //copy some value to local variable x (of type int)
{
   x = 5; //modify local variable. lost after function call
}

void func2(int *x) //copy some value to local variable x (of type int*)
{
   int a;
   x = &a; //modify local variable. lost after function call.
}

void func3(int *x) //copy some value to local variable x(of type int*)
{
   *x = 10; //x is local but *x is not! change is saved after function call!
}

func1 と func2 は同一です。どちらもローカル変数を変更します。関数がスタックからポップされると、変更は失われます。func3 には、別のメモリ位置 (関数に対してローカルではない変数) を変更する機能があります。

基本的に、すべての関数呼び出しは「値による呼び出し」です。しかし、ポインタ型の場合、メモリ内のリモート アドレスの内容を変更する方法があります。

于 2010-12-13T09:59:23.063 に答える
2

ポインターを使用した値渡し 例で説明します。

void f(int *ptr)
{
   cout<<*ptr;
}


int main ()
{
   int a=10;
   int *aptr=&a;
   f(aptr);
   return 0;
} 

ここで、メイン関数の a は、内容が 10 でアドレスが 00F8FB04 の整数変数です (仮定)。aptr は整数変数 a のアドレスを格納する整数へのポインタであるため、aptr の内容は整数変数 a のアドレスである 00F8FB04 です。関数引数として aptr を渡すと、aptr の内容 (つまりアドレス) のみが関数パラメーターにコピーされます。したがって、ptr は aptr のコンテンツのコピーを受け取ります (つまり、アドレス 00F8FB04)。

于 2019-06-23T07:54:31.737 に答える
0

ポインター自体を変更する可能性がある場合は、ポインターへのポインターまたはポインターへの参照のいずれかを使用します。元の質問に対して、技術的には、はい、すべてのパラメーターは値で渡されます。

于 2010-12-13T07:06:29.293 に答える
0

はい、C の場合と同様です。

その場合、ポインタへのポインタを関数への引数として使用して、関数内でポインタ値をそのまま変更することは許容/標準的な手順ですか?

その場合?なんでしょう?&修飾子で実際の参照を使用できます。

void func(type &ref);
于 2010-12-13T07:08:10.160 に答える