何時使用引用和指標

2021-09-26 10:40:12 字數 1980 閱讀 5245

「但是,請等一下」,你懷疑地問,「這樣的**會產生什麼樣的後果?」

char *pc = 0;// 設定指標為空值

char& rc = *pc;// 讓引用指向空值

這是非常有害的,毫無疑問。結果將是不確定的(編譯器能產生一些輸出,導致任何事情都有可能發生)。

因為引用肯定會指向乙個物件,引用應被初始化。

string& rs;// 錯誤,引用必須被初始化

string *ps;// 指標沒有這樣的限制,未初始化的指標,合法但危險

string s("xyzzy");

string& rs = s;// 正確,rs是s的引用

不存在指向空值的引用這個事實意味著使用引用的**效率比使用指標的要高。因為在使用引用之前不需要測試它的合法性。

void printdouble(const double& rd)

void printdouble(const double *pd)

}

指標與引用的另乙個重要的不同:是指標可以被重新賦值以指向另乙個不同的物件。但是引用則總是指向在初始化時被指定的物件,以後不能改變。

string s1("nancy");

string s2("clancy");

string& rs = s1; // rs 引用 s1

string *ps = &s1; // ps 指向 s1

rs = s2; // rs 仍舊引用s1,但是 s1的值現在是 "clancy"

ps = &s2; // ps 現在指向 s2; s1 沒有改變

在以下情況下你應該使用指標:

還有一種情況,就是當你過載某個操作符時,你應該使用引用。最普通的例子是操作符.這個操作符典型的用法是返回乙個目標物件,其能被賦值。

vectorv(10); // 建立整形向量(vector),大小為10;

v[5] = 10; // 這個被賦值的目標物件就是操作符返回的值

//如果操作符返回乙個指標,那麼後乙個語句就得這樣寫:

*v[5] = 10;

但是這樣會使得v看上去象是乙個向量指標。因此你會選擇讓操作符返回乙個引用。

當你知道你必須指向乙個物件並且不想改變其指向時,或者在過載操作符並為防止不必要的語義誤解時,你不應該使用指標。而在除此之外的其他情況下,則應使用指標

假設你有

void func(int* p, int& r);

int a = 1;

int b = 1;

func(&a,b);

指標本身的值(位址值)是以pass by value進行的,你能改變位址值,但這並不會改變指標所指向的變數的值

p = someotherpointer;//a is still 1
但能用指標來改變指標所指向的變數的值

*p = 123131; // a now is 123131
引用本身是以pass by reference進行的,改變其值即改變引用所對應的變數的值

r = 1231;// b now is 1231
盡可能使用引用,不得已時使用指標。

當你不需要「重新指向」時,引用一般優先於指標被選用。這通常意味著引用用於類的公有介面時更有用。引用出現的典型場合是物件的表面,而指標用於物件內部

什麼時候需要使用引用?

程式設計師能夠修改呼叫函式中的資料物件

通過傳遞引用而不是整個資料物件,可以提高程式的執行速度。

當資料物件較大時(如結構和類物件),第二個原因最重要,這些也是使用指標引數的原因。這是有道理的,因為引用引數實際上是基於指標的**的另乙個介面。

何時使用引用引數

節選自己c primer plus 5 使用引用引數的主要原因有兩個 1.程式設計師能夠修改呼叫函式中的資料物件 2.通過傳遞引用而不是整個資料物件,可以提高程式的執行速度 當資料物件較大時 結構和類物件 第二個原因最重要。這些也是使用指標引數的原因。這是有道理的,因為引用引數實際上是基於指標的 的...

何時使用指標引數 引用引數 按值傳遞?

1 什麼是引用?如何使用引用?為什麼要使用引用?1 什麼是引用?引用變數是一種偽裝指標,它允許為變數建立別名 另乙個名稱 在初始化乙個引用變數時,必須對其進行初始化。2 何時使用引用?引用變數主要被用作處理結構和類物件的函式的引數。3 為什麼要使用引用?4 返回引用時的注意事項 2 什麼時候應使用引...

指標和引用,const 指標和const 引用

指標和引用是在使用中經常弄混淆的兩個概念。引用 reference 為物件起了另外乙個名字,用符號 表示。name,例如 int i 1024 int ref i 一般在初始化變數時,初始值會被拷貝到新建立的物件中,然而定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引...