請問C 中引用和指標的區別,C 中引用和指標的區別

2022-07-09 05:15:06 字數 5118 閱讀 9812

1樓:快樂程式設計師

c++引用與指標的比較

引用是c++中的概念,初學者容易把引用和指標混淆一起。

一下程式中,n是m的乙個引用(reference),m是被引用物(referent)。

int m;

int &n = m;

n相當於m的別名(綽號),對n的任何操作就是對m的操作。

所以n既不是m的拷貝,也不是指向m的指標,其實n就是m它自己。

引用的規則:

(1)引用被建立的同時必須被初始化(指標則可以在任何時候被初始化)。

(2)不能有null引用,引用必須與合法的儲存單元關聯(指標則可以是null)。

(3)一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變所指的物件)。

以下示例程式中,k被初始化為i的引用。

語句k = j並不能將k修改成為j的引用,只是把k的值改變成為6。

由於k是i的引用,所以i的值也變成了6。

int i = 5;

int j = 6;

int &k = i;

k = j; // k和i的值都變成了6;

引用的主要功能是傳遞函式的引數和返回值。

c++語言中,函式的引數和返回值的傳遞方式有三種:值傳遞、指標傳遞和引用傳遞。

以下是"值傳遞"的示例程式。

由於func1函式體內的x是外部變數n的乙份拷貝,改變x的值不會影響n, 所以n的值仍然是0。

void func1(int x)

...int n = 0;

func1(n);

cout << "n = " << n << endl; // n = 0

以下是"指標傳遞"的示例程式。

由於func2函式體內的x是指向外部變數n的指標,改變該指標的內容將導致n的值改變,所以n的值成為10。

void func2(int *x)

...int n = 0;

func2(&n);

cout << "n = " << n << endl; // n = 10

以下是"引用傳遞"的示例程式。

由於func3函式體內的x是外部變數n的引用,x和n是同乙個東西,改變x等於改變n,所以n的值成為10。

void func3(int &x)

...int n = 0;

func3(n);

cout << "n = " << n << endl; // n = 10

對比上述三個示例程式,會發現"引用傳遞"的性質象"指標傳遞",而書寫方式象"值傳遞"。

實際上"引用"可以做的任何事情"指標"也都能夠做,為什麼還要"引用"這東西?

答案是"用適當的工具做恰如其分的工作"。

指標能夠毫無約束地操作記憶體中的任何東西,儘管指標功能強大,但是非常危險。

如果的確只需要借用一下某個物件的"別名",那麼就用"引用",而不要用"指標",以免發生意外。

2樓:匿名使用者

引用就是傳遞的原始變數,指標傳遞的是變數的位址,兩者沒什麼關係,

引用主要用於函式引數的傳遞,相對於傳值,可以節省記憶體空間,

指標可以直接傳遞變數位址,也可以可以節省記憶體空間,但是指標功能強大一些,可以在自由運算元組變數,多看看書就會了,不難。

3樓:

按最簡單的方法說吧

指標是儲存變數位址的變數,引用則是變數的別名

一般情況下,引用比指標更直觀,更容易讓看懂,所以一般情況都會用引用,但是請記住,因為引用不能賦值而且不能為空,所以當需要返回改變了的值和null時,不要用引用要用指標

c++中引用和指標的區別

請簡述c++中引用和指標的區別

4樓:砍侃看

關於指標和引用的區別,c++ primer是這麼說的:

1、引用總是指向某個物件;定義引用時沒有初始化是錯誤的。

2、賦值行為有差異。給引用賦值修改的是該引用所關聯的物件的值,而不是使引用於另乙個物件關聯。引用已經初始化,就始終指向同乙個特定物件。

舉個列子:

引用就像是你的身份證號,一出生就有了,而且終身不變,也不能把這個身份證號給別人。無論什麼時候,對這個身份證號做的操作,都是對你做操作。

指標就像是你公司的工號,可以把這個工號指向你,也可以改變這個工號讓它指向別人。

5樓:影者東昇

本質:引用是別名,指標是位址,具體的:

①從現象上看,指標在執行時可以改變其所指向的值,而引用一旦和某個物件繫結後就不再改變。這句話可以理解為:指標可以被重新賦值以指向另乙個不同的物件。

但是引用則總是指向在初始化時被指定的物件,以後不能改變,但是指定的物件其內容可以改變。

②從記憶體分配上看,程式為指標變數分配記憶體區域,而不為引用分配記憶體區域,因為引用宣告時必須初始化,從而指向乙個已經存在的物件。引用不能指向空值。

注:標準沒有規定引用要不要佔用記憶體,也沒有規定引用具體要怎麼實現。

③ 從編譯上看,程式在編譯時分別將指標和引用新增到符號表上,符號表上記錄的是變數名及變數所對應位址。指標變數在符號表上對應的位址值為指標變數的位址值,而引用在符號表上對應的位址值為引用物件的位址值。符號表生成後就不會再改,因此指標可以改變指向的物件(指標變數中的值可以改),而引用物件不能改。

這是使用指標不安全而使用引用安全的主要原因。從某種意義上來說引用可以被認為是不能改變的指標。

④不存在指向空值的引用這個事實,意味著使用引用的**效率比使用指標的要高。因為在使用引用之前不需要測試它的合法性。相反,指標則應該總是被測試,防止其為空。

⑤理論上,對於指標的級數沒有限制,但是引用只能是一級。如下:

int** p1; // 合法。指向指標的指標

int*& p2; // 合法。指向指標的引用

int&* p3; // 非法。指向引用的指標是非法的

int&& p4; // 非法。指向引用的引用是非法的

注意上述讀法是從左到右。

c++中引用和指標的區別,引用的優勢在哪?

6樓:厄帴

先搞清楚命名和指標的區別,命名說白了只是在語言層面的東西,**經過編譯器變異後,命名是沒有任何作用的。指標是的確存在的東西,經過編譯器編譯後,是需要分配記憶體空間的,這個就是2個最大的區別。通常情況下,乙個空間對應乙個命名,引用可以給乙個空間同時命名多個命名;指標是用變數儲存乙個位址資訊,乙個指標變數乙個時刻只能儲存乙個位址資訊。

請簡述c++中引用和指標的區別

7樓:草原上之狼

關於指標和引用的區別,c++ primer是這麼說的:

1、引用總是指向某個物件;定義引用時沒有初始化是錯誤的。

2、賦值行為有差異。給引用賦值修改的是該引用所關聯的物件的值,而不是使引用於另乙個物件關聯。引用已經初始化,就始終指向同乙個特定物件。

舉個列子:

引用就像是你的身份證號,一出生就有了,而且終身不變,也不能把這個身份證號給別人。無論什麼時候,對這個身份證號做的操作,都是對你做操作。

指標就像是你公司的工號,可以把這個工號指向你,也可以改變這個工號讓它指向別人。

c++中引用與指標的區別

8樓:go陌小潔

c++中指標與引用的區別:

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)指標和引用的自增(++)運算意義不一樣;

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

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

#include

using namespace std;

void swap(int *a,int *b)

int main(void)

int main(void)

輸出結果為:0x22ff44 1

指標p不為null

9樓:幻夢·人生

相同點:

都是位址的概念;

指標指向一塊記憶體,它的內容是所指記憶體的位址;而引用則是某塊記憶體的別名。

不同點:

指標是乙個實體,而引用僅是個別名;

引用只能在定義時被初始化一次,之後不可變;指標可變;引用「從一而終」,指標可以「見異思遷」;

引用不能為空,指標可以為空;

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

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

引用是型別安全的,而指標不是(引用比指標多了型別檢查)

10樓:匿名使用者

引用就是重新命名:

int a = 0;

int& b = a;

就是給 a 這個變數重新取乙個名字.

所以 你在使用 a或b的時候其實都是使用的同乙個變數.

比如:有人個人叫張三。張三的好朋友常常叫張三 小張。

也就是說 張三和小張是同乙個人。

11樓:笨笨de世界

引用是別名,共享一塊記憶體空間,而指標是要單獨佔4位元組的記憶體空間的,裡面存的是另一塊記憶體位址的索引

j**a的引用和c++的指標的區別

C指標與引用有何區別,淺談C 中指標和引用的區別

c 中 1 指標,通俗的理解就是,把記憶體的位址記下來,以便直接跳到相應的記憶體位址上去取資料,或執行指令。指標c 中算是比較高階的玩法,非常規的指標值改動常常會造成莫明的錯誤,然而有些高明的指標運用可以事半功倍。但在當前模組化程式設計中,一般不建議隨意動用非常規的指標值改動 c 的常規指標運用中,...

C 中引用返回和標準返回的區別

舉個例子 int f int x int main 所謂引用傳遞就是不複製記憶體,把自己傳遞給對方,標準傳遞就是把自己的複製品傳遞給對方.程式首先定義變數a 這裡理解成佔用一塊4位元組大小的記憶體,把記憶體標識成a,然後在這塊記憶體裡存1個整數10 然後程式執行f a 注意到程式引數傳遞是引用形式的...

C怎麼引用外部dll,C中如何新增dll引用啊

一 建立dll檔案 例如生成乙個md5編碼判斷狀態的檔案,即,輸 不要新增 的嘛。有另外種啊 在解決方案管理器中。選擇你的專案它,引用 新增引用 找到你的dll即可 可以用反射來呼叫dll裡面的方法,你可以去網上搜搜,有很多用反射來呼叫dll裡面的方法的例子 新增引用 直接把dll放入自己的專案 引...