wordpress綁定槐蔭區(qū)網(wǎng)絡(luò)營銷seo
????????引用(reference)和指針(pointer)都是 C++ 中用來間接訪問內(nèi)存中對象的機制,但它們有一些重要的區(qū)別。以下是它們在語法、用法和特性上的詳細區(qū)別。
下面從7個方面來詳細說明引用和指針的區(qū)別
1. 定義與語法區(qū)別
- 引用(reference) 是某個變量的別名。它在聲明時必須被初始化,并且初始化后不能改變引用的目標(biāo)。
- 指針(pointer) 是一個變量,它存儲另一個變量的內(nèi)存地址。指針可以在運行時被重新賦值,并且可以為空(
nullptr
)。int a = 10; int &ref = a; // ref 是 a 的引用int a = 10; int *ptr = &a; // ptr 是指向 a 的指針
2. 初始化與重新賦值
-
引用必須在聲明時進行初始化,并且一旦引用了某個變量,就不能再引用其他變量。引用不能指向
nullptr
,它必須始終有效。 -
指針可以在聲明時不初始化,并且可以在任何時候指向不同的對象。指針可以是空指針(
nullptr
或NULL
),即指向無效的內(nèi)存。int x = 5; int &ref = x; // 引用必須在聲明時初始化 ref = 10; // 改變的是 x 的值int x = 5; int y = 10; int *ptr; // 可以不初始化 ptr = &x; // 指向 x 的地址 ptr = &y; // 重新指向 y 的地址
3. 訪問對象的方式
-
引用直接使用對象的名字來訪問所引用的對象,無需解引用。
-
指針需要使用解引用運算符
*
來訪問指針?biāo)赶虻膶ο蟆?/p>int x = 5; int &ref = x; // ref 是 x 的引用 std::cout << ref << std::endl; // 直接訪問 x 的值int x = 5; int *ptr = &x; std::cout << *ptr << std::endl; // 通過解引用訪問 x 的值
4. 內(nèi)存地址的訪問
-
引用本身沒有自己的內(nèi)存地址,它只是所引用對象的別名。你不能獲取引用本身的地址,只能獲取它所引用的對象的地址。
-
指針有自己的內(nèi)存地址,并且存儲的是它所指向?qū)ο蟮膬?nèi)存地址。你可以獲取指針的地址,也可以獲取它指向的對象的地址。
int x = 5;
int &ref = x;
std::cout << &ref << std::endl; // 輸出的是 x 的地址int x = 5;
int *ptr = &x;
std::cout << ptr << std::endl; // 輸出的是指針存儲的 x 的地址
std::cout << &ptr << std::endl; // 輸出的是指針本身的地址
5. 指向空值或無效值
-
引用不能指向
nullptr
或者無效的對象。它在聲明時就必須引用有效的對象。 -
指針可以是
nullptr
,表示不指向任何對象,或者指向無效的內(nèi)存地址(雖然指向無效地址是危險的)。int &ref = nullptr; // 錯誤!引用不能為 nullptr int *ptr = nullptr; // 指針可以為 nullptr
6. 修改所指對象的值
-
引用可以修改所引用對象的值,引用本質(zhì)上就是對該對象的直接訪問。
-
指針可以通過解引用來修改所指對象的值。
int x = 5; int &ref = x; ref = 10; // x 的值被修改為 10 int x = 5; int *ptr = &x; *ptr = 10; // 通過解引用修改 x 的值為 10
7. 常量引用與指針
-
常量引用(
const
reference):常量引用允許引用一個對象,但不允許修改它的值。常用于函數(shù)參數(shù)中,避免拷貝對象,但又能確保函數(shù)不會修改對象。 -
常量指針與指向常量的指針:
-
指向常量的指針:指針可以指向一個常量對象,不能通過指針修改對象的值。
-
常量指針:指針本身是常量,不能改變指針指向的地址,但可以修改指向?qū)ο蟮闹怠?/p>
-
int x = 5; const int &ref = x; // ref = 10; // 錯誤,不能通過 const 引用修改值 const int x = 5; const int *ptr = &x; // *ptr = 10; // 錯誤,不能通過指向常量的指針修改值 int x = 5; int *const ptr = &x; *ptr = 10; // 可以修改 x 的值 // ptr = &y; // 錯誤,不能修改 ptr 指向的地址
?
?