パラメータの中で、値の受け渡し、ポインタの受け渡し、参照の受け渡しの違い

値の転送:
正式なパラメーターは実際のパラメーターのコピーであり、正式なパラメーターの値を変更しても、外部の実際のパラメーターの値には影響しません。呼び出された関数の観点からは、値の転送は一方向です(実際のパラメーター->正式なパラメーター)。割り当てが完了すると、実際のパラメーターは正式なパラメーターとは関係がなくなります。関数内でパラメーターを変更する必要があり、この変更が呼び出し元に影響を与えたくない場合は、値を渡します。

#include<stdio.h>    //值传递示例
void swap(int a,int b)
{   //拷贝临时变量 
	int temp=a; 
	a=b;
	b=temp;
};  //函数调用后a和b的值进没有达到交换目的 
int main()
{ 
	int a=1, b=2;
	swap(a,b);
	printf("a=%d,b=%d", a, b);
    //输出结果a=1,b=2,a和b的值没有改变
	return 0;
}

 

ポインタ転送:
仮パラメータは、実パラメータのアドレスへのポインタです。仮パラメータを操作する場合は、実パラメータ自体を操作するのと同じです。

ポインタを渡すパラメータは本質的に値を渡す方法であり、渡すのはアドレス値です。アドレスの受け渡しも一種の値の受け渡しであると言われるのはなぜですか?転送アドレスは、実際のパラメータアドレスのコピーを仮パラメータに転送するためです。つまり、アドレスを渡すということは、実パラメータのアドレスを仮パラメータにコピーすることです。コピー後は、実パラメータのアドレスと仮パラメータのアドレスの間に関係はありません。次に、関数内のポインターポイントを変更しても、関数外のポインターインスタンスには影響しません。ただし、関数内でポインターが指す変数の値が変更されると、メイン関数の実際のパラメーターポインターが指す変数の値が変更されます。

#include<stdio.h>    //指针传递示例
void swap(int *a,int *b)
{     //int *是一个整体,表明变量类型是指针
    int temp=*a;
    *a=*b;
    *b=temp;
}
int main(){
   int x=1, y=2;
   swap(&x,&y);
   printf("x=%d,y=%d",x, y);
   //输出x=2,y=1, x和y的值改变了
}

 

参照渡し:
&は参照引数を表します。これは、仮パラメーターが実際のパラメーターの別名であることを意味します。操作参照変数は、操作引数変数です。これはC ++構文であり、標準Cではサポートされていません。

参照転送の過程で、呼び出された関数の仮パラメータはスタック内のメモリ空間を開くためのローカル変数としても使用されますが、このとき、呼び出し元の関数によって入力された実際のパラメータ変数のアドレスが格納されます。仮パラメータに対する呼び出された関数の操作は、間接アドレス指定として処理されます。つまり、呼び出し元の関数の実際のパラメータ変数は、スタックに格納されているアドレスを介してアクセスされます。このため、仮パラメーターに対して呼び出された関数によって実行される操作は、呼び出し元の関数の実際のパラメーター変数に影響を与えます。

#include<stdio.h>    //引用传递示例
void swap(int &a,int &b)
{   
	int temp=a; 
	a=b;
	b=temp;
};  //函数调用后a和b的值进行了交换 
int main()
{ 
	int a=1, b=2;
	swap(a,b);
	printf("a=%d,b=%d", a, b);
    //输出a=2,b=1, a和b的值改变了 
	return 0;
}

参照とポインタの違い:

ポインタはメモリブロックを指し、その内容はポイントされたメモリのアドレスです。一方、参照はメモリブロックのエイリアスであり、参照の初期化後にポイントを変更することはできません。使用すると、参照はより安全になり、ポインターはより柔軟になります。

  著者:wxquare出典:ほとんど知っている

  1. 初期化。参照は初期化する必要があり、初期化後に変更することはできません。ポインターを初期化する必要はなく、ポインターは指定されたオブジェクトを変更できます。
  2. ヌル値。ポインターはNULL値を指すことができ、NULL値への参照はありません。参照またはポインターがパラメーターとして渡される場合、参照を取得するときに参照が空であるかどうかを判断する必要はありませんが、ポインターを取得するときに、それが空であるかどうかを判断する必要があります。これは、関数パラメーターが有効かどうかを判断するときによく使用されます。
  3. 参照とポインタがオブジェクトを指している場合、参照の作成と破棄は、クラスのコピーコンストラクタとデストラクタを呼び出しません。ポインタを削除すると、オブジェクトのデストラクタが呼び出されます。二次的な破壊を防ぐように注意してください。
  4. 参照とポインタとconst。定数ポインタと定数参照ポインタがあり、ポイントされたオブジェクトが定数であることを示し、ポインタまたは定数を介して定数を変更することはできません。ポインタ定数はありますが、参照自体は変更できないため、参照定数はありません。ポインタの特性とポインタ定数の特性は同じです。参照定数。
  5. 関数パラメーターを渡すときにポインターまたは参照を使用する効果は同じです。どちらも呼び出し元の関数の関連変数を簡潔に操作します。ポインターを変更しても呼び出し元の関数の関連変数に影響しないため、その時点での参照の方が安全です。したがって、可能な限りパラメータを渡すときは参照を使用してください。
  6. sizeofはオブジェクトのサイズを指し、sizeofポインターはポインター自体のサイズです。
  7. 参照とポインタの実装は同じです。「参照は単なるエイリアスであり、メモリ空間を占有しない」という記述は誤りです。実際、参照もメモリ空間を使用します。

 

おすすめ

転載: blog.csdn.net/weixin_42467709/article/details/81093423