C 指標和引用的區別與聯絡

2021-07-28 03:45:22 字數 2474 閱讀 8998

標籤: c語言

c++指標引用

2016-08-13 11:05

79人閱讀收藏 

舉報

c/c++(8)

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

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

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

int a=1;  int

*p=&a;

int a=1; int &b=a;

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

(2)可以有const指標,常量指標可以改變指向,指標常量不能改變指向,也可以有const引用,引用的指向不能改變;

int i = 1;

int j = 2;

intconst &c = i; //定義常量引用

cout

<< c << endl;

//c = j; //error,常量引用不能更改指向

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

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

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

int i = 1;

int j = 2;

int &a = i; //a = 1;

a = j; //可以改變引用的值,但是仍然指向原來的記憶體單元,a = 2,i = 2

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

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

2.指標和引用作為函式引數進行傳遞時的區別。

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

#include

using namespace std;

void swap(int

*a,int

*b)int main(void)

結果為2 1;

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

再看乙個程式;

#include

using

namespace

std;

void test(int *p)

執行結果為: 

0x22ff44 1 

指標p為null

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

如果要想達到也同時修改的目的的話,就得使用引用了,或者使用二級指標。

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

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

看下面這個程式:

#include

using

namespace

std;

void test(int &a)

輸出結果為: 

0x22ff44 1 

0x22ff44 1

再看下這個程式:

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

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

#include

using

namespace

std;

void test(int *&p)

輸出結果為: 

0x22ff44 1 

指標p不為null 

何時使用指標和引用見本人部落格:

參考:

指標和引用的聯絡與區別

相同點 1.都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址 引用是某塊記憶體的別名。區別 1.指標是乙個實體,而引用僅是個別名 2.引用使用時無需解引用 指標需要解引用 3.引用只能在定義時被初始化一次,之後不可變 指標可變 4.引用沒有 const,指標有 const 5.引用不能...

指標和引用的聯絡與區別

指標和引用的聯絡與區別 相同點 1.都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址 引用是某塊記憶體的別名。區別 1.指標是乙個實體,而引用僅是個別名 2.引用使用時無需解引用 指標需要解引用 3.引用只能在定義時被初始化一次,之後不可變 指標可變 4.引用沒有 const,指標有 ...

詳解c 指標和引用的區別與聯絡

相同點 1.都是位址的概念 指標指向一塊記憶體,它的內容是所指記憶體的位址 引用是某塊記憶體的別名。區別 1.指標是乙個實體,而引用僅是個別名 2.引用使用時無需解引用 指標需要解引用 3.引用只能在定義時被初始化一次,之後不可變 指標可變 引用 從一而終 4.引用沒有 const,這是因為引用本身...