C、C++での参照とポインタの違い

2474 ワード

1:参照とポインタの概念的な違い
参照は変数の別名です.たとえば
  int m;   int &n=m; 参照は別名として使用されます.論理的に独立していないため、参照は最初から初期化され、参照されるオブジェクトはライフサイクル全体で変更できません(最初から最後まで同じ変数にのみ依存できます).参照に対する操作、すなわち変数に対する操作.参照は、一般的に関数の処理に使用されるパラメータと戻り値です.使用規則:a:参照は作成時に初期化される必要があります(ポインタはいつでも値を付与できます).b:参照は、決定された合法的なメモリユニットに関連付けられる必要があります.NULL参照は存在しません.c:リファレンスが初期化されると、リファレンスが指す変数は変更できません.
#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
	int a=1;
	int b=2;
	int &k=b;
	printf("%d   %d   %d   %p    %p    %p
",a,b,k,&a,&b,&k); k=a; printf("%d %d %d %p %p %p
",a,b,k,&a,&b,&k); return 0; }

参照別名kとbは同じアドレスを有し,b変数が間接的に変化することは明らかである.(a,b,cルールに適合)
     
ポインタは変数であり、別の変数のアドレスが格納されています.
   int m;
   int *n=&m;
したがって、ポインタによって変数のアドレスを直接操作することができ、プログラマーはより柔軟な選択をすることができますが、ポインタはより多くの不安全な要素をもたらします.
したがって、変数のポインタとしては、論理的に独立しており、その指向するアドレスの変更と、その指向するアドレスに格納されたデータの変更を含む変更が可能である.
 
3:ポインタが関数に参照されるときの違い:
C++では、ポインタと参照は関数のパラメータ伝達によく使用されますが、ポインタ伝達パラメータと参照伝達パラメータは本質的に異なります.
ポインタ伝達パラメータは本質的に値伝達方式であり、アドレス値を伝達する.値伝達の過程で、被変調関数の形式パラメータは被変調関数の局所変数として処理され、すなわちスタックにメモリ空間が開き、主変調関数から入ってきた実パラメータの値を格納し、実パラメータのコピーとなる.値伝達の特徴は,形式パラメータに対する被変調関数の任意の操作が局所変数として行われ,主変調関数の実パラメータ変数の値に影響を及ぼさないことである.(ここでは実パラメトリックポインタ自体のアドレス値は変化しないという)参照伝達過程において,被変調関数の形式パラメータも局所変数としてスタックにメモリ空間を開いたが,このときは主変調関数から入ってきた実パラメトリック変数のアドレスが格納される.被変調関数対パラメータの任意の動作は、スタックに格納されたアドレスを介して主変調関数の実パラメータ変数にアクセスする間接アドレスとして処理される.そのため,被変調関数がパラメータに与える任意の操作は,主変調関数における実パラメータ変数に影響を及ぼす.両者のより細かい違いは、●前に紹介したconstの使い方に対してint&const aという形式はないが、const int&aはある.前者は引用そのもの、すなわち別名は変えられない.これは当然であるから、この形式は必要ない.後者は引用が指す値は変えられない.●「sizeof参照」は、指向する変数(オブジェクト)の大きさであり、「sizeofポインタ」はポインタ自体の大きさである.●ポインタと参照の自己増加(++)演算の意味が異なる.●参照はタイプが安全で、ポインタはそうではありません(参照がポインタより多いタイプチェック)
関数パラメータ伝達における運用を参照します.(固定されたstaticタイプに似ていますが、自由に変えることができます)
#include <iostream>

using namespace std;

void Func(int &n)
{
    n++;
    cout<<"now the value is "<<n<<endl;
}
int main()
{
    int a=10;
    Func(a);
    Func(a);
}
の内容の一部は次のとおりです.
http://www.cnblogs.com/lintong/archive/2012/07/28/2613222.html