C 深陷 之「指標」

2021-10-06 23:28:22 字數 3207 閱讀 5490

指標是c++中的一種復合型別,是「指向(pointer to)」另外一種型別的復合型別,實現了對其他物件的間接訪問。

它與引用的不同點在於,指標是乙個物件,引用不是。

指標的內容是被指向物件的位址。

int a =10;

// 指向a的指標,p中存放的是a的位址

int*p =

&a;

關於指標,需要了解如下內容:

指標的宣告

指標的初始化

指標的值

指標的拷貝&賦值

指標的使用

指標與const

使用*搭配其他資料型別,可以宣告乙個指標。

int

*p;char

*s;double

*d;

若宣告的指標沒有初始化,它將執行預設初始化,它的值是乙個不確定的值。

我們使用取位址運算子

int a =10;

// &a得到a的位址

int*pa =

&a;

我們通過解引用運算子*來得到指標所指向的物件的內容。

cout <<

*pa;

// 輸出10

若要輸出指標的內容,可以直接使用:

cout <<

&a;// 輸出0x7ffee109f828

cout << pa;

// 輸出0x7ffee109f828

指標在程式任意時刻,只有四種型別的值:

指向乙個物件

指向緊鄰物件所佔空間的下乙個位置,例如尾後指標

空指標,意味著指標沒有指向任何物件

無效指標,也就是上述情況之外的其他值

上述4條:

int a =10;

int arr[3]

=;// 1. 指向乙個物件

// 此時指標是有效的,訪問是安全的

int*pa =

&a;// 2. 尾後

int*parr = arr +3;

parr = std::

end(arr)

;// 推薦

// 3. 空指標

pa =

nullptr

;// 推薦使用nullptr

pa =0;

parr =

null

;// 4. 無效指標

myclass *pp =

newmyclass()

;delete pp;

// 此時,pp是無效的,訪問pp非常危險

養成良好的習慣,除非你胸有成竹,否則訪問指標前都判斷一下。

nullptr是c++11新引入的,一種特殊的字面值,它可以轉換為任意型別的指標。

過去我們使用預處理變數null來代表空指標,實際上它是定義在cstdlib中的巨集定義,它的值是0。

這樣會出現乙個問題,當我有一些過載的函式:

void

func1

(int

*p,bool flag)

;// 過載版本1

void

func1

(int a,

bool flag)

;// 過載版本2

當我如下方式使用時:

func1

(null

,true);

// 我想呼叫第1個過載版本

因為null會在編譯時被顯示替換成字面值0,根據函式匹配規則永遠會匹配到第2個版本,與我本來的意思相違背。

但是使用nullptr則不同:

func1

(nullptr

,true

);

因為nullptr可以轉換為任意型別的指標,在匹配時優先匹配到過載版本1,符合程式設計師的本意。

與引用不同,允許指標的拷貝和賦值。

int a =

10, b =20;

int*p =

&a;// 初始化指標指向a

int*pt =

nullptr

;// 將指標指向b

// 賦值操作

p =&b;

// 指標指向b

// 拷貝操作

pt = p;

之前提到過,通過解引用運算子*實現對指向物件的間接訪問。

解引用運算子得到的是左值,因此可以直接拿來賦值:

int a =10;

cout << a << endl;

// 輸出10

int*p =

&a;*p =20;

cout << a << endl;

// 輸出20

函式引數可以傳遞指標,傳遞引數的行為和其他非引用型別是一樣的,即值傳遞,拷貝的實際上是指標的值,因此可以實現在函式內部修改外部物件的功能。

void

reset

(int

*buff_size)

intmain()

指標與const的問題,產生的原因就是指標是物件。const既可以修飾指標本身,也可以修飾指標指向的情況,分別稱作頂層const底層const

詳細內容,請參考【c++深陷】之「const」。

指標是c++中的一種復合型別,是「指向(pointer to)」另外一種型別的復合型別,實現了對其他物件的間接訪問。

指標要注意它本身是乙個物件,因此存在指標的引用、指標的指標。

程式任意時刻,指標的值只有四種型別。要盡量使用nullptr作為空指標的定義。

指標的拷貝和賦值,和其他非引用型別一樣,函式傳遞引數也是值傳遞,即傳遞的是指標的內容,某物件的位址。

C 深陷 之「函式模板」

c 中的模板 template 是泛型程式設計的基礎。乙個模板就是乙個藍圖,用來建立類或函式的藍圖。模板主要分為兩類 函式模板 function template 類模板 class template 本文主要介紹函式模板 function template 關於模板的全部內容,參考 c 深陷 之 ...

C 深陷 之「類模板」

c 中的模板 template 是泛型程式設計的基礎。乙個模板就是乙個藍圖,用來建立類或函式的藍圖。模板主要分為兩類 函式模板 function template 類模板 class template 本文主要介紹類模板 class template 關於模板的全部內容,參考 c 深陷 之 模板 乙...

C 深陷 之「記憶體對齊」

現代計算機在處理資料時,按照某個 單位 來處理。32位機器,每次處理32位 4位元組的二進位制資料,64位同理。記憶體對齊指的是計算機系統對基本資料型別合法位址做出了一些限制,要求某種型別物件的位址必須是某個值的倍數。本文著重於記憶體對齊的基本原理,有關複雜情況下 虛函式 繼承等 的記憶體對齊方案,...