C++引用,引用和指針有那麼一絲不一樣

1:引用的和指針在概念上的區別

(-)引用是變量的別名,例如

int m;

int &n=m;

引用作為一個別名。它在邏輯上不是獨立的,它的存在具有依附性,所以引用必須在一開始就被初始化,而且其引用的對象在其整個生命週期中是不能被改變的(自始至終只能依附於同一個變量)。則任何對引用的操作即對變量的操作。

引用一般是用於處理函數的參數與返回值。

引用的使用規則:

  • a:引用在創建的時候必須被初始化(指針可以在任何時候賦值)
  • b:引用必須與一個確定的合法內存單元相關聯。不存在NULL引用。
  • c:一旦引用初始化後,就不能改變引用所指向的變量。
int i = 5;
int j = 6;
int &k = i;
k = j; // k和i的值都變成了6,而不是k指向了j。

(二)指針是一個變量,其存放的是另外一個是變量的地址,

int m;

int *n=&m;

所以通過指針可以對變量的地址進行直接操作,這樣程序員有著更加靈活的選擇,但是,指針會帶來更多的不安全因素。

因此作為一個變量的指針,其在邏輯上是獨立的,它可以被改變,包括其所指向的地址的改變和其指向的地址中所存放的數據的改變。

2:引用於指針在函數傳參時的區別:

在C++中,指針和引用經常用於函數的參數傳遞,然而,指針傳遞參數和引用傳遞參數是有本質上的不同的:

指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值。值傳遞過程中,被調函數的形式參數作為被調函數的局部變量處理,即在棧中開闢了內存空間以存放由主調函數放進來的實參的值,從而成為了實 參的一個副本。值傳遞的特點是被調函數對形式參數的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值。(這裡是在說實參指針本身的地址值不會變)

而在引用傳遞過程中,被調函數的形式參數雖然 也作為局部變量在棧中開闢了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放 的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。

3:二者更加細微的區別有:

  • 相對於前面介紹的const的用法,沒有int& const a這種形式,而const int& a是有的, 前者指引用本身即別名不可以改變,這是當然的,所以不需要這種形式,後者指引用所指的值不可以改變。
  • “sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身的大小;
  • 指針和引用的自增(++)運算意義不一樣;
  • 引用是類型安全的,而指針不是 (引用比指針多了類型檢查)

4: 引用在函數參數傳遞中的運用:

#include <iostream>
using namespace std;

void Func(int &n)
{
n++;
cout<}
int main()
{
int a=10;
Func(a);
Func(a);
}
/<iostream>


分享到:


相關文章: