基本となる参照はポインタ定数です。
高級言語レベルでは、ポインタ定数と参照変数の関係は次のとおりです。
- メモリ内では、4バイト(32ビットシステム)の領域を占有します。これらは定義時に初期化する必要があり、ポイントされたオブジェクトまたは参照されたオブジェクトは変更できません。ポインタ定数は、ポイントされたオブジェクトのアドレスを格納します。参照参照されるオブジェクトのアドレスも変数に格納されます。
- ポインタ定数自体はアドレス指定を許可します。参照変数自体はアドレス指定できません。参照変数のアドレス操作は、参照変数によって参照されるオブジェクトのアドレスを返します。(参照変数のアドレスはコンパイラーによって制御され、プログラマーはこれに直接アクセスできません)。
- 参照変数を使用するコードは、ポインター定数を使用する対応する形式のコードに変換できます。逆に、ポインタ定数を使用するコードは、必ずしも参照変数で実装されるとは限りません。たとえば、ポインタ定数の配列を参照変数の配列に変更することはできません。実際、参照の配列を作成することはできません。
#include <iostream>
using namespace std;
/*
* 证明引用是变量(指针常量),需要分配内存。虽然无法在高级语言层面更改引用所指向的变量,但是可以
* 通过特殊手段,找到引用变量的地址,并修改其指向的对象。
* 编译环境:VS2015 Debug x86
*/
int main() {
int i = 4;
int j = 5;
int &ri = i;
void *pi, *pj;
pi = &i;
pj = &j;
cout << "[addr] i=0x" << pi << endl;
cout << "[addr] j=0x" << pj << endl;
int dis = int(pi) - int(pj);
cout << "[dis] dis=" << dis << endl; // 变量i和变量j之间地址的差值
int *addr = reinterpret_cast<int*>(int(pj) - dis); // 计算引用ri的地址
*addr -= dis; // 令引用ri指向j
ri = 45;
cout << i << j << endl; // 输出:4 45
getchar();
}