c++ 學習之 引用

c++ 學習之 引用

前言

當我們需要在函數內部對外部變量進行改變值操作時,必須要傳遞實參。我們最常見的作法就是傳遞一個指向該變量地址的指針,但是指針操作,往往讓很多小夥伴很頭疼,那麼接下來給大家介紹一下可以實現同樣功能而且更加方便的的操作 引用

正文

什麼是引用

引用變量是一個變量的別名,也就是說,它是某個已存在變量的另一個名字。一旦把引用初始化爲某個變量,就可以使用該引用名稱或變量名稱來指向變量。其實當你定義一個變量的時候,就相當於給一塊內存地址起了一個名字,我們可以通過變量名來找到這塊內存地址。那麼定義引用呢,就相當於給了這塊內存地址又起了個名字,通過引用同樣可以找到這塊內存地址。就像你生下來身份證上要有一個名字,你的父母又給你起了一個小名,兩個名字都是你一樣。

定義一個引用

那麼如何定義一個引用呢? 就是在你正常定義變量的形式上在變量名前加一個&。話不多說,上代碼。

	int a =1;
	int &b =a;
	printf("%d %d %p %p",a,b,&a,&b);

輸出結果:1 1 0095FAD0 0095FAD0
可以看到此時,a與b的地址是同一個地址,這也印證了我上文的話。
值得注意的是,當你定義一個引用的時候,必須要用已有的變量對其進行初始化!!!!

引用與typedef的區別

上文說到,引用就是對變量起一個別名,聽到別名,我們的第一 反應就是typedef。同樣是起別名,typedef與引用時有本質上區別的。typedef是對於類型起的別名,比如說對 int,float了,char類型起別名。而引用是對於變量起別名,比如,你已定義過一個整型變量叫a,那麼此刻,就可以用引用對這個變量a起別名。 其實引用也是一種類型,可以用typedef對相應的引用類型起別名。

typedef int& p
{
	  int a = 1;
	  p b = a;
	  printf("%d %d %p %p\n",a,b,&a,&b);
  
}

引用與指針的區別

1.定義引用時必須要用一個已有變量去初始化,而指針可以在任何時間被初始化。同樣的,引用時不可以爲空的,但是可以有空的指針。
2.一旦引用初始化後,就不可以賦值給別的變量,而指針可以改變其指向的空間。

引用的實質

引用的實質其實是常量指針的使用,只不過c++編譯器在內部進行了實現。

	int a =1;
	int &b =a;
	int * const c = &a;
	

這個第二行代碼和第三行代碼其實是一樣,引用底層的實現就是第三行那樣。從 const 就可以看出,爲什麼當引用指向一個變量後,就不可以改變指向其他變量了。

引用的應用

在函數參數中的應用。

void Swap(int a,int b)
{
	  int temp =a;
	  a = b;
	  b = temp;
}

這樣的函數是無法對外面的兩個變量進行值交換的,因爲這種函數傳遞的是形參,本質是值傳遞,只是對其值進行了拷貝,實際上到了函數內部,就變成了另外兩個棧區變量了,當函數運行結束,這兩個變量的作用域結束,就會被操作系統釋放掉。想要真正的實現功能,是必須要傳遞實參的,有兩種方法。
1.指針參數

void Swap(int *a,int *b)
{
	 int temp = *a;
	 *a = *b;
	 *b =temp;
}

這樣的就是傳入兩個變量的地址,通過變量的地址進行間接引用來操縱地址指向的內容。

2.引用參數

void Swap(int &a,int &b)
{
	 int temp =a;
	 a = b;  
         b = temp;
}

這樣傳入的就是兩個變量的引用,可以直接對相應地址上的內容進行操作,比起指針,這樣的確方便了很多。
其實這樣的函數傳參方式也可以寫成這樣:

void Swap(int *const a,int *const b)
{
	 int temp = *a;
	  *a = *b;
	  *b =temp;
}

這個東西知道就好,只是更好的幫你理解引用,沒必要真的用這個代替引用。

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