C 中指標和引用的區別

2021-09-25 01:36:49 字數 2960 閱讀 3899

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

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)指標是乙個實體,而引用僅是個別名;

(10)程式為指標變數分配記憶體區域,而引用不需要分配記憶體區域;

(11)指標和引用作為函式引數進行傳遞時也不同。用指標傳遞引數,可以實現對實參進行改變的目的;在將引用作為函式引數進行傳遞時,實質上傳遞的是實參本身,而不是實參的乙個拷貝,因此對形參的修改其實是對實參的修改。

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

指標和引用的相同點:

兩者都是位址的概念,指標指向一塊兒記憶體,其內容為所指記憶體的位址;引用是某塊兒記憶體的別名。

區分用指標和引用的不同情況:

使用引用的情況:

1.常引用,用這種方式宣告的引用,不能通過引用對目標變數的值進行修改,從而使引用的目標成為const,達到了引用的安全性,函式體不能對引用型引數修改目標變數。宣告方式:const 型別識別符號 &引用名 = 目標變數名

2.作為函式的返回值,當類a的資料成員包含b類的物件,可以在類a中定義乙個方法,返回b類的物件的引用,返回的是引用就不會有副本產生,可以直接修改類對應類b的物件。

函式定義時要按以下格式:

型別識別符號  &函式名 (形參列表及型別說明)

{ 函式體 }

引用作為返回值,必須遵守以下規則:

1.不能返回區域性變數的引用,主要原因是區域性變數會在函式返回後被銷毀,因此被返回的引用就成為了"無所指"的引用,程式會進入未知狀態。

2.不能返回函式內部new分配的記憶體的引用。雖然不存在區域性變數的被動銷毀問題,可對於這種情況(返回函式內部new分配記憶體的引用),又面臨其它局面。例如,被函式返回的引用只是作為乙個臨時變數出現,而沒有被賦予乙個實際的變數,那麼這個引用所指向的空間(由new分配)就無法釋放,造成記憶體洩漏。

使用指標和引用的情況對比

1.是考慮到存在不指向任何物件的可能(在這種情況下,能夠設定指標為空)

2.需要能夠在不同的時刻指向不同的物件(在這種情況下,能改變指標的指向)。如果總是指向乙個物件並且一旦指向乙個物件後就不會改變指向,那麼就應該使用引用。

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

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

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

#includeusing namespace std;

void swap(int *a,int *b)

int main(void)

{  int a=1,b=2;

swap(&a,&b);

cout《結果為2 1;

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

再看乙個程式;

#includeusing namespace std;

void test(int *p)

{  int a=1;

p=&a;

cout《執行結果為:

指標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)

{  cout<<&a<<" "《輸出結果為: 1

再看下這個程式:

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

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

#includeusing namespace std;

void test(int *&p)

{  int a=1;

p=&a;

cout《輸出結果為:1

C 中 (指標引用)和 (指標)的區別

很久之前學的c 了,複習一下,指標是乙個存放位址的變數,而指標引用指的是這個變數的引用,眾所周知c 中如果引數不是引用的話會呼叫引數物件的拷貝建構函式,所以如果有需求想改變指標所指的物件 換句話說,就是要改變指標裡面存的位址 就要使用指標引用,在網上看到大佬的 簡單明瞭,如下 include usi...

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

指標 是位址 即記憶體單元的編號 指標變數 是乙個存放位址的變數 指標引用 指的是這個指標變數的引用 眾所周知c 中如果引數不是引用的話會呼叫引數物件的 拷貝建構函式 重新開闢一塊一模一樣的記憶體空間 所以如想改變指標變數裡面存的位址,就要使用指標引用 讀 前請先搞懂 二級指標 指標的指標 指向指標...

C 中指標和引用的區別

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