C++中引用与指针的区别(详细介绍)
生活随笔
收集整理的這篇文章主要介紹了
C++中引用与指针的区别(详细介绍)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載:http://www.cnblogs.com/tracylee/archive/2012/12/04/2801519.html
C++中的引用與指針的區別 指向不同類型的指針的區別在于指針類型可以知道編譯器解釋某個特定地址(指針指向的地址)中的內存內容及大小,而void*指針則只表示一個內存地址,編譯器不能通過該指針所指向對象的類型和大小,因此想要通過void*指針操作對象必須進行類型轉化。 ? ? ??★ 相同點: ? ? ? 1. 都是地址的概念; ? ? ? ?指針指向一塊內存,它的內容是所指內存的地址; ? ? ? ?引用是某塊內存的別名。 ? ? ? ★ 區別: ? ? ? 1. 指針是一個實體,而引用僅是個別名; ? ? 2. 引用使用時無需解引用(*),指針需要解引用; ? ? 3. 引用只能在定義時被初始化一次,之后不可變;指針可變; ? ? ? ?引用“從一而終” ^_^ ? ? 4. 引用沒有 const,指針有 const,const 的指針不可變; ? ? 5. 引用不能為空,指針可以為空; ? ? 6.?“sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或對象的地址)的大小; ? ? typeid(T) == typeid(T&) 恒為真,sizeof(T) == sizeof(T&) 恒為真,但是當引用作為類成員名稱時,其占用空間與指針相同4個字節(沒找到標準的規定)。 ? ? 7. 指針和引用的自增(++)運算意義不一樣; ? ? ? ★ 聯系 ? ? ??1. 引用在語言內部用指針實現(如何實現?)。 ? ? 2. 對一般應用而言,把引用理解為指針,不會犯嚴重語義錯誤。引用是操作受限了的指針(僅容許取內容操作)。 ? ? 引用是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++語言中,函數的參數和返回值的傳遞方式有三種:值傳遞、指針傳遞和引用傳遞。 ? ? ? 1)以下是“值傳遞”的示例程序。由于Func1 函數體內的x 是外部變量n 的一份拷貝,改變x 的值不會影響n, 所以n 的值仍然是0. ?| ??void Func1(int x) { x = x + 10; } int n = 0; Func1(n); cout << “n = ” << n << endl;// n = 0 |
? ? ? 2)以下是“指針傳遞”的示例程序。由于Func2 函數體內的x 是指向外部變量n 的指針,改變該指針的內容將導致n 的值改變,所以n 的值成為10.
| void Func2(int *x) { (* x) = (* x) + 10; } ⋯ int n = 0; Func2(&n); cout << “n = ” << n << endl; // n = 10 |
? ? ? 3)以下是“引用傳遞”的示例程序。由于Func3 函數體內的x 是外部變量n 的引用,x和n 是同一個東西,改變x 等于改變n,所以n 的值成為10.
| ??void Func3(int &x) { x = x + 10; } ⋯ int n = 0; Func3(n); cout << “n = ” << n << endl; // n = 10 |
| ??? string& rs; // 錯誤,引用必須被初始化 ??? string s("xyzzy"); ??? string& rs = s; // 正確,rs指向s ??? 指針沒有這樣的限制。 ??? string *ps; // 未初始化的指針 ??? // 合法但危險 |
| void printDouble(const double& rd) { ???? cout << rd; // 不需要測試rd,它 } // 肯定指向一個double值 相反,指針則應該總是被測試,防止其為空: void printDouble(const double *pd) { ???? if (pd) ???? { // 檢查是否為NULL |
| ??string s1("Nancy"); string s2("Clancy"); string& rs = s1; // rs 引用 s1 string *ps = &s1; // ps 指向 s1 rs = s2; // rs 仍舊引用s1, // 但是 s1的值現在是 // "Clancy" ps = &s2; // ps 現在指向 s2; // s1 沒有改變 |
| ??vector<int> v(10); // 建立整形向量(vector),大小為10; // 向量是一個在標準C庫中的一個模板(見條款35) v[5] = 10; // 這個被賦值的目標對象就是操作符[]返回的值 如果操作符[]返回一個指針,那么后一個語句就得這樣寫: *v[5] = 10; |
| ?void func(int* p, int&r); int a = 1; int b = 1; func(&a,b); |
總結
以上是生活随笔為你收集整理的C++中引用与指针的区别(详细介绍)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都欢乐谷寄存东西怎么收费
- 下一篇: C++虚继承的概念