《認清C 語言》 引用和指標

2021-06-09 07:39:36 字數 2386 閱讀 2515

1、  首先要認識到不存在類似於空引用(null reference)這樣的東西。引用必須要指代某個物件,因此,如果有乙個用於指代另外乙個物件的變數,但是有可能沒有這麼乙個可供指代的物件,這時就應該把這個變數宣告成指標,因為這樣就可以將它設為空值(null)了。反之,如果這個變數必須指代乙個物件,即我們將這個變數設計成不允許為空值,那麼這時基本上應該將這個變數宣告成引用。

2、 因為引用總是要指代乙個物件,c++要求引用必須初始化。

std::string& ace;     

//err!

引用必須初始化

std::string sace(

「rid」);

std::string& ace= sace; 

//ok!

引用ace指向sace

指標並沒有類似的限制:

std::string *ps;         

//未初始化的指標,合法但具有風險!

3、 不存在空引用這個事實說明,使用引用比使用指標更高效,因為在使用引用前不需要測試它是否有效:

void

aceprint(

const

double

& db)

而與之相反,指標通常需要檢查其是否為空:

void

aceprint(

const

double

*db)

}4、 指標和引用另乙個重要不同點在於:指標可以被重新賦值用以指向另外乙個不同的物件;而引用則始終指向初始化時它所指代的物件:

std::string ace1(

「hw」);

std::string ace2(

「rid」);

std::string& race = ace1;                 

//race

指代ace1

std::string *pace = ace1;                 

//pace

指向ace1

race = ace2;   

//race

依然指代ace1,但ace1的值現在是「rid」

pace = &ace2;        

//pace

現在指向ace2,ace1的值不變

5、 總之,當需要考慮以下兩種情況時,應該使用指標:有可能什麼也不指向(這種情況下,我們可以把指標設為空值);需要能夠在不同時候指向不同的物件(這種情況下可以更改指標的指向)。

當我們知道總是會指向某乙個物件並且一旦指定那個物件,就不會再指向其他物件時,應該使用引用。

6、 還有一種情況應該使用引用,即當實現某些操作符的時候。最常見的例子是操作符。這個操作符通常需要返回乙個值作為(下乙個)賦值語句的賦值目標:

vector<

int> v(10);

v[5] = 10;

我們可以看到,如果操作符返回乙個指標,那麼上面最後一條語句就必須寫成:

*v[5] = 10;

這讓v看起來像是乙個關於指標的向量,而實際並非如此。因此,絕大多數情況下操作符都應該返回乙個引用。

(p.s引用是乙個現有物件的別名,用物件來初始化引用後,那麼物件的名字或引用的名字都可以用於指向該物件。人們常常將引用和指標混淆,原因大概在於c++編譯器通常採用指標的方式實現引用,但引用實際不是指標,其行為和指標並不相同。如前面所說,引用和指標存在三大區別:一是不存在空引用;二是所有引用都要初始化;三是乙個引用永遠指向用來對它初始化的那個物件。

乙個指向非常量的引用是不可以用字面值或臨時值進行初始化的:

double

&aced = 13.4;  

//err

!template

<

typename

t>

void

swap(t &a, t&b)

swap(std::string(

「hello」), std::string(「, world」));     //err

!然而,乙個指向常量的引用就可以:

const

double

&aced = 13.4;         

//ok

!template

<

typename

t>

t add(

const

t &a,

const

t &b)

...const

std::string &greeting = add(std:string(

「hello」), std::string(「, world」));    //ok!

當乙個指向常量的引用採用乙個字面值來初始化時,該引用實際上被設定成指向「採用該字面值初始化」的乙個臨時位置。)

C語言指標和c 引用

c 引用和c指標區別 在c和c 中,指標一般指的是某塊記憶體的位址,通過這個位址,我們可以定址到這塊記憶體 而引用是乙個變數的別名,例如我們給小明起了個外號 明明,那我們說明明的時候,就是說小明。對於指標來說,它是乙個位址,這個位址是乙個數值,那麼就意味這個數值可以為0 空指標 也可以為其他,即指標...

C語言 指標和引用的區別

指標和引用的區別 1.指標是乙個實體,而引用是乙個別名 在彙編上,引用的底層是以指標的方式實現的,定義乙個引用變數,相當於就是定義了乙個指標,然後把引用記憶體的位址寫到這個指標裡面,當通過引用變數修改它所引用的記憶體時,它先訪問了指標裡面的位址,然後在這個位址的記憶體裡面對值進行修改 2.指標可以不...

C 指標和引用

在深入介紹之前我們首先來看一下指標和引用的定義 指標和引用的區別,然後分別針對指標和引用展開討論,深入細節為何有這些差異。指標和引用的定義,下面用通俗易懂的話來概述一下 而宣告指標是可以不指向任何物件,也正是因為這個原因,使用指標之前必須做判空操作,而引用就不必。其次,引用不可以改變指向,對乙個物件...