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放入自己的專案 引...