爲了更容易理解指針和引用的區別。我們先執行一段代碼。
int main(){
int a = 1;
int *p = &a;
cout<<"a = "<<a<<endl;
cout<<"&a = "<<&a<<endl;
cout<<"p = "<<p<<endl;
cout<<"*p = "<<*p<<endl;
cout<<"&p = "<<&p<<endl;
int b= 1;
int &c = b;
cout<<"b = "<<b<<endl;
cout<<"&b = "<<&b<<endl;
cout<<"&c = "<<&c<<endl;
cout<<"c = "<<c<<endl;
return 0;
};
下面是執行結果:
a = 1
&a = 0x28ff28
p = 0x28ff28
*p = 1
&p = 0x28ff24
b = 1
&b = 0x28ff20
&c = 0x28ff20
c = 1
一目瞭然了,對嗎?
我看到很多文章說,引用和變量的值是一樣的,引用只不過是變量的一個別名。這句話是對的。但是對於新手小白來說,心裏是凌亂的。*和&是什麼鬼???
指針:存的是變量的地址。如圖所示,指針p的值等於a的值的內存地址0x28ff28,我們這裏說的指針是單獨一個p,前面不帶任何符號的。一旦帶了,它的概念就變了。*p = 1,取的變量a的值,*p取的內存地址裏面的變量的值。&p = 0x28ff24,這裏的怎麼又不一樣了?這裏是聲明指針p之後,系統給這個指針p分配的地址,&在這裏就是取內存地址的意思。&p就是獲取指針p的內存地址,而指針p的內存地址裏內容是什麼?就是變量a的內存地址。這樣表述是不是很清晰明瞭呢?
引用:變量的別名。我們說的引用是單獨一個c,前面不帶任何符號的,c = 1,它跟變量的值一樣,我們通常說的變量的別名就是這個意思了。一旦它前面帶了符號,它的概念就變了。&c=ox28ff20,&c取的是變量b的內存地址,可以看到&b=&c,這就是引用。我們可以再通俗的理解一下,引用一旦被初始化爲一個對象,就不能被指向另一個對象。就相當於房東把房子租給你了,他就不能再租給別人,而你租了這個房子,你就可以爲所欲爲了。再繞回來,就是變量把它的房子(內存地址)給引用了,引用就可以爲所欲爲改它的內容了。
我們來改變一下引用的值:
int main(){
int b= 1;
int &c = b;
cout<<"b = "<<b<<endl;
cout<<"&b = "<<&b<<endl;
cout<<"&c = "<<&c<<endl;
cout<<"c = "<<c<<endl;
int d = 2;
c = d;
cout<<"b = "<<b<<endl;
cout<<"&c = "<<&c<<endl;
cout<<"c = "<<c<<endl;
return 0;
};
結果:
b = 1
&b = 0x22fe40
&c = 0x22fe40
c = 1
b = 2
&c = 0x22fe40
c = 2
引用c的值從1變成了2,b的值也從1變成了2,但是引用C的地址是始終沒有改變的。
引用的幾個特點:
1.引用的類型必須和其綁定的變量的類型相同
double d = 12.3;
int &a = d;//錯誤,類型必須一致
int x = 0;
int &y = x;//正確
return 0;
2.聲明引用的同時必須對其初始化,否則報錯。
int &a;//錯誤,必須初始化
return 0;
3.聲明引用的初始化賦值必須是左值。要麼就前面加個const。什麼是左值,就是不能直接賦值,而是等於其他變量。
int c = 1;
int &a = 1;//錯誤,必須賦值左值
int &b = c;//正確
4.引用不是定義一個新的變量或對象,因此內存不會爲引用開闢新的空間存儲這個引用
int value = 10;
int &new_value = value;
const int &new_value2 = new_value;
cout<<”value在內存中的地址爲:”<<&value<<endl;
cout<<” new_value在內存中的地址爲:”<<& new_value <<endl;
cout<<” new_value2在內存中的地址爲:”<<& new_value2 <<endl;
//這3個值的地址一樣
5. 引用通常用於函數參數列表和函數返回值。
// 函數聲明
void swap(int& x, int& y);
int main ()
{
// 局部變量聲明
int a = 100;
int b = 200;
cout << "交換前,a 的值:" << a << endl;
cout << "交換前,b 的值:" << b << endl;
/* 調用函數來交換值 */
swap(a, b);
cout << "交換後,a 的值:" << a << endl;
cout << "交換後,b 的值:" << b << endl;
return 0;
}
// 函數定義
void swap(int& x, int& y)
{
int temp; temp = x;
/* 保存地址 x 的值 */
x = y;
/* 把 y 賦值給 x */
y = temp;
/* 把 x 賦值給 y */
return;
}
喜歡的點個贊!!!我也是最近開始學習C++,以一個初學者的視角來解釋,更能被同是初學者的你們來理解。後續我會繼續更新的,可以關注我!