C++指針和引用(簡單直白的解釋,新手小白上手快,容易理解)

爲了更容易理解指針和引用的區別。我們先執行一段代碼。

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++,以一個初學者的視角來解釋,更能被同是初學者的你們來理解。後續我會繼續更新的,可以關注我!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章