1. 程式人生 > 其它 >C++引用和指標&, *

C++引用和指標&, *

宣告變數時
*表示該變數為指標型
&表示該變數為引用型

int a = 12;
int *p;
int &d = a;  //引用必須定義時就初始化

d = *p;
p = &d;

int vala = *p;
int valb = d;

指標的意義是地址,引用的意義是值
所以如上,p是指標,是地址,d是引用是值(所指向地址的值)
所以想獲取指標的值,需要*, *p是指標指向的值
想獲取引用的地址,需要&,&d是獲取引用指向的地址
除卻定義時的宣告外,*用於從指標取值,&用於從數值取地址

指標就是地址,所以上面程式碼中,p 可以等於 &d
引用是地址所儲存的值,所以d 可以等於 *p


int main()
{
    int i = 100;
    int &y = i;
    int *p = &i;
    int val = 150;
    cout << "Step1, i的地址:" << &i << "=y的指向:" << &y << "=p的值:" << p << "=p指向的值" << *p << endl;
    cout << "p的地址:" << &p << endl;

    y = val;
    cout << "Step2, i的地址:" << &i << "=y的指向:" << &y << "=p的值:" << p << "=p指向的值" << *p << endl;
    cout << "p的地址:" << &p << endl;
}

結果:

Step1, i的地址:004FFE48=y的指向:004FFE48=p的值:004FFE48=p指向的值100
p的地址:004FFE30
Step2, i的地址:004FFE48=y的指向:004FFE48=p的值:004FFE48=p指向的值150
p的地址:004FFE30

可以看到,
引用本身是和指標很類似的東西,都是一個地址,
只不過指標本身就是一個儲存地址的變數,指標的值是指向的地址,可以通過獲取指標的指向來獲取指標指向的值
而引用,就是一個目標地址的拷貝,一個別名,引用等同於原變數,和原變數是完全一樣的東西
從上面的結果就可以看得出來,y的地址和原變數的地址一樣
指標是系統新分配一個地址來存放指標變數,這個地址存放的是指向的地址
引用沒有新分配,它就是原變數。
修改引用就是修改原值。
由於引用只是改變了原地址上的值,地址沒變,所以原來指向該地址的指標,獲取的值也被改變了。