計算機程序基礎教程(10):C語言 - 指針
【指針基礎】
C語言使用數(shù)據(jù)名調(diào)用數(shù)據(jù),數(shù)據(jù)名無法實現(xiàn)匯編中的間接內(nèi)存尋址,為此C語言提供了指針功能,指針本身是一個數(shù)值數(shù)據(jù),用于存儲另一個數(shù)據(jù)的地址,從而實現(xiàn)數(shù)據(jù)的間接尋址,使用指針調(diào)用不同地址、不同數(shù)據(jù)時,調(diào)用數(shù)據(jù)的代碼無需修改,只需要修改指針的值即可。
指針也稱為指針變量,在32位程序中,指針變量是一個無符號4字節(jié)整數(shù),在64位程序中,指針變量是一個無符號8字節(jié)整數(shù)。
指針有類型之分,其存儲哪種類型數(shù)據(jù)的地址就屬于哪種類型的指針,編譯器通過指針類型確定要操作多少內(nèi)存地址,比如int類型指針操作4個內(nèi)存地址。
定義指針變量時首先指定指針類型,之后編寫*符號表示這是一個指針變量,賦值時使用&符號提取一個數(shù)據(jù)的地址。
使用指針變量時,在指針變量名前添加*符號,表示調(diào)用指針指向的數(shù)據(jù),而非指針變量本身。
?● 多重指針
指針變量本身還可以被另一個指針存儲,相當于多層間接尋址。
int ** a;? ? //指針的指針
int *** b;? ?//三重指針
?● 指針作為數(shù)組元素
二維數(shù)組作為參數(shù)時,編譯器自動轉(zhuǎn)換為指針,同一維數(shù)組。
也可以使用雙重指針代替二維數(shù)組當做參數(shù)。
?● 指針作為參數(shù)
?● 指針作為返回值
【數(shù)組指針】
數(shù)組指針為數(shù)組第一個元素的指針,第一個元素的地址就是數(shù)組的地址。
【結(jié)構體指針】
使用指針調(diào)用結(jié)構體成員有兩種方式:
1.指針名->成員名。
2.(*指針名).成員名。
【共用體指針】
【函數(shù)指針】
函數(shù)指針存儲一個函數(shù)的地址,定義函數(shù)指針比較復雜,首先指定返回值類型,之后編寫一個()符號,內(nèi)部設置指針名,以*號開頭,之后編寫第二個()符號,內(nèi)部設置參數(shù)類型,為函數(shù)指針賦值直接編寫函數(shù)名即可。
函數(shù)指針作為參數(shù)
【指針運算】
指針變量可以進行數(shù)學運算,不同類型的指針運算結(jié)果不同。
變量指針+1,指針本身增加變量的長度,比如int指針+1等于指針值+4,定位到下一個int數(shù)據(jù),short指針+1等于指針值+2。
數(shù)組指針+1,指針本身增加數(shù)組元素的長度,定位到數(shù)組下一個元素。
結(jié)構體指針+1,指針本身增加結(jié)構體的長度,注意結(jié)構體長度并非所有成員長度的總和,需要額外計算地址對齊占用的存儲空間。
函數(shù)指針,不支持數(shù)學運算。
兩個類型相同的指針之間可以進行減法運算,表示計算兩個指針記錄的地址之間存儲了多少個數(shù)據(jù)。
【指針類型轉(zhuǎn)換】
指針類型可以轉(zhuǎn)換,編譯器將按照轉(zhuǎn)換后的類型操作內(nèi)存地址。
指針類型可以定義為void,表示空類型,空類型指針可以存儲任何數(shù)據(jù)的地址,也可以轉(zhuǎn)換為任何類型的指針。
當你需要接收一個指針,但又不確定它的類型時,可以定義一個空類型指針接收它,之后轉(zhuǎn)換為具體的類型再使用。