指標和引用的區別

2021-07-04 03:12:06 字數 2599 閱讀 8776

指標和引用在c++中很常用,但是對於它們之間的區別很多初學者都不是太熟悉,下面來談談他們2者之間的區別和用法。

1.指標和引用的定義和性質區別:

(1)指標:指標是乙個變數,只不過這個變數儲存的是乙個位址,指向記憶體的乙個儲存單元;而引用跟原來的變數實質上是同乙個東西,只不過是原變數的乙個別名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定義了乙個整形變數和乙個指標變數p,該指標變數指向a的儲存單元,即p的值是a儲存單元的位址。

而下面2句定義了乙個整形變數a和這個整形a的引用b,事實上a和b是同乙個東西,在記憶體占有同乙個儲存單元。

(2)可以有const指標,但是沒有const引用;

(3)指標可以有多級,但是引用只能是一級(int **p;合法 而 int &&a是不合法的)

(4)指標的值可以為空,但是引用的值不能為null,並且引用在定義的時候必須初始化;

(5)指標的值在初始化後可以改變,即指向其它的儲存單元,而引用在進行初始化後就不會再改變了。

(6)"sizeof引用"得到的是所指向的變數(物件)的大小,而"sizeof指標"得到的是指標本身的大小;

(7)指標和引用的自增(++)運算意義不一樣;

(8)從記憶體分配上看:程式為指標變數分配記憶體區域,而引用不需要分配記憶體區域。
2.指標和引用作為函式引數進行傳遞時的區別。

(1)指標作為引數進行傳遞:

#includeusing

namespace

std;

void swap(int *a,int *b)

int main(void

)

結果為2 1;

用指標傳遞引數,可以實現對實參進行改變的目的,是因為傳遞過來的是實參的位址,因此使用*a實際上是取儲存實參的記憶體單元裡的資料,即是對實參進行改變,因此可以達到目的。

再看乙個程式;

#includeusing

namespace

std;

void test(int *p)

int main(void

)

執行結果為:

0x22ff44 1

指標p為null

大家可能會感到奇怪,怎麼回事,不是傳遞的是位址麼,怎麼p回事null?事實上,在main函式中宣告了乙個指標p,並賦值為null,當呼叫test函式時,事實上傳遞的也是位址,只不過傳遞的是指位址。也就是說將指標作為引數進行傳遞時,事實上也是值傳遞,只不過傳遞的是位址。當把指標作為引數進行傳遞時,也是將實參的乙個拷貝傳遞給形參,即上面程式main函式中的p何test函式中使用的p不是同乙個變數,儲存2個變數p的單元也不相同(只是2個p指向同乙個儲存單元),那麼在test函式中對p進行修改,並不會影響到main函式中的p的值。

如果要想達到也同時修改的目的的話,就得使用引用了。

(2)將引用作為函式的引數進行傳遞。

在將引用作為函式引數進行傳遞時,實質上傳遞的是實參本身,即傳遞進來的不是實參的乙個拷貝,因此對形參的修改其實是對實參的修改,所以在用引用進行引數傳遞時,不僅節約時間,而且可以節約空間。

看下面這個程式:

#includeusing

namespace

std;

void test(int &a)

int main(void

)

輸出結果為: 0x22ff44 1

0x22ff44 1

再看下這個程式:

這足以說明用引用進行引數傳遞時,事實上傳遞的是實參本身,而不是拷貝。

所以在上述要達到同時修改指標的目的的話,就得使用引用了。

#includeusing

namespace

std;

void test(int *&p)

int main(void

)

輸出結果為:0x22ff44 1

指標p不為null

使用引用形參的優點:

在向函式傳遞大物件時,需要使用引用形參。雖然賦值實參對於內建資料型別的物件或者規模較小的型別來說沒有什麼問題,但是對於大部分的型別或者大型陣列,它的效率就比較低了。另外,某些型別是無法複製的。使用引用形參,函式可以直接訪問實參物件,而無須複製它。

示例:bool isshorter(const string &str1,const string &str2)//const

由於string物件可能非常的長,我們希望避免複製操作。

如果使用引用形參的唯一目的是避免複製形參,則應將形參定義為const引用。

使用引用形參應該注意的:

int incr(int &val)

void main(void)

所以,呼叫非const型別的引用形參,實參必須不是const型別的,而且實參的型別和形參的型別應當一致。

乙個引用形參被翻譯成乙個指標變數,相應的實參被翻譯成這個實參的位址。當在函式中被使用時,指標形參被自動的去引用,從而產生對應實參的別名。(from資料結構與演算法分析)

在以上例子中,引用形參 val被翻譯成乙個指標變數,呼叫incr(v3)時,v3這個實參被翻譯成v3的位址。

海子出處:

指標引用和引用指標的區別

c 在傳參的過程中,指標 和指標引用 是有區別的。雖然,我們往往可以通過傳指標然後通過間址訪問來修改指標所指向物件的值,同樣,通過引用也可以直接修改物件的值。但是,當傳指標的時候有乙個問題,就是,我們雖然可以通過指標來修改指標所指向物件的值,但是我們沒有不能直接修改指標的內容 也就是指標變數存放的位...

傳指標和傳指標引用的區別 指標和引用的區別(本質)

指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...

傳指標和傳指標引用的區別 指標和引用的區別(本質)

指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...