次のコードの違いは何ですか:-
int a;
int *p;
p=&a;
function(p);
と
int a;
function(&a);
私は本を読んでいて、最初のコードを使用したり、他のコードを使用したりしていました。しかし、それは良い本ではありません(地元の著者による)。
両方のコードは同じように機能しますか、それとも違いがありますか?
また、効率の面で違いはありますか?それだけ重要ですか?
ありがとう
参照の場合、オブジェクトを参照するには、オブジェクトがすでに存在している必要があります。ポインタに関しては、ポインタを宣言するときにオブジェクトがすでに存在している必要はありません
例:
int &i = 10; //Invalid
const int &i = 10; //Valid
また
参照の配列を宣言することはできません。
int &tab[] = {2,3}; //Invalid
int * tab[] = {2,3}; //Valid
実際には、参照は主に関数パラメーターおよび戻り値として使用されます。
私の知る限り、コンパイラーは参照をポインターとして実装します。したがって、パフォーマンスに違いはありません。ただし、参照はより厳密であり、間違いを防ぐことができます。たとえば、参照を再バインドしたり、参照を使用して算術演算を実行したりすることはできません
また、オブジェクトを変更する関数へのポインターを渡すことを好む人もいます。例えば
void changeVal(int *p)
{
*p = 10;
}
彼らはあなたが見るときそれがより読みやすいと言います:
changeVal(&var)
よりも
changeVal(var);
編集
reference
それが参照するオブジェクトの別の名前と考えることができます。したがって、加えられたすべての変更がreference
オブジェクトに適用されます。次に例を示します。
void foo_copy(int a) //pass by copy
{
a = 10; //changes copy
}
void foo(int &a) //bass by reference
{
a = 10; //changes passed value
}
void foo(int *a) //pass an adress of a
{
(*a) = 10; //change a value pointed by a
a = nullptr; //change a (the pointer). value is not affected
}
最新のコンパイラでコンパイルした場合、2つのコードスニペットは同等である必要があります。追加の宣言と割り当て(p=&a;
)は最適化されます。
上記の2つのアプローチでは、どちらもポインタを使用しています。sizeof(int *)に等しいメモリが「int * p」のスタックに割り当てられることを除いて、違いはありません。
参照による呼び出しの場合は、を参照してください。あなたは初心者で物事を学んでいるようです。クラスでコピーコンストラクターを使用している間、参照による受け渡しとその使用についてもっと知るようになります。