當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > C語言:數(shù)據(jù)指針
今天我們來聊一聊數(shù)組指針,對于C語言中常見數(shù)據(jù)類型,數(shù)組和指針可能學(xué)過C語言的都不陌生,但兩個合起來又是怎么一回事呢?首先要理解數(shù)組指針,我們需要先從數(shù)組和指針說起。
數(shù)組,什么是數(shù)組?即是將相同數(shù)據(jù)類型的元素連續(xù)緊密的存儲,稱這種數(shù)據(jù)類型叫數(shù)組。數(shù)組名即代表該數(shù)據(jù)類型本身同時他本質(zhì)上卻又是一個地址,即數(shù)據(jù)元素的首地址。通常訪問數(shù)據(jù)一般使用”數(shù)組名[數(shù)組下標(biāo)]”的方式訪問數(shù)組中的元素,當(dāng)然也可以使用部分的指針方式去操作。
那什么又是指針呢?指針即是地址,這種說法其實(shí)不太準(zhǔn)確。通常我們所說的指針是指指針變量,何為指針變量?指針變量是指一個存儲地址的變量,即是說一個變量中存放了一個地址數(shù)據(jù),這個地址是指向一個某個數(shù)據(jù)類型的。通常一個未賦初始值的指針變量叫作野指針,這種指針在程序中是很危險的,因該指針除賦值以外的任何指針操作都將是危險的,會發(fā)生意想不到的問題甚至錯誤。通常對于一個還不便于建立指向關(guān)系的指針,通常我們會把它的值設(shè)置為NULL,即地址0,這個指針稱作空指針。
那什么是數(shù)組指針呢?通常我們中文的語法結(jié)構(gòu),事物的本質(zhì)或重點(diǎn)一般會放在后邊,即數(shù)組指針,本質(zhì)上是一個指針,什么指針呢?一個指向數(shù)組的指針。那么前面我們說到數(shù)組名本身就是一個地址,而一個指向地址的指針,則這個指針至少是一個二級指針,那如何定義和使用這個指針呢?例如有一個整型數(shù)組int a[5];那么定義數(shù)組指針并指向它:int (*p)[5] = &a;則稱p為一個指向有5個元素的整型數(shù)組指針。通常數(shù)組指針跟二維數(shù)組在一起出現(xiàn)。例如,當(dāng)我們想要將一個二維數(shù)組作為形參傳入函數(shù),那么這個形參該如何定義?通常這種形參是一個指針,一個可以指向二維數(shù)組中每一個一維數(shù)組的指針,即數(shù)組指針。例如有整型二維數(shù)組 int b[2][3];那么形參的數(shù)組指針應(yīng)該這樣定義 int (*q)[3];則此時 q=b;數(shù)組指針和二維數(shù)組可以直接賦值即建立指向關(guān)系。其實(shí)二維數(shù)組名就是一個地址,一個指向一維數(shù)組的地址,即它的本質(zhì)就是一個數(shù)組指針。通常我們在進(jìn)行動態(tài)內(nèi)存分配時也時常會用到數(shù)組指針。比如,我使用malloc函數(shù)開辟了一段內(nèi)存空間,我想以二維數(shù)組的方式操作這片內(nèi)存,這時就需要一個數(shù)組指針去存放這個地址。
那數(shù)組指針有哪些操作呢?因為數(shù)組指針本質(zhì)上是一個指針,所以所有的指針操作都可以對它進(jìn)行。當(dāng)對數(shù)組指針進(jìn)行++或--操作時,地址的移動是一個指向的單位,即一個數(shù)組的長度。因此數(shù)組指針的定義必須給定指針指向的數(shù)組的元素個數(shù)。同時,也可以將指針數(shù)組當(dāng)做一個二維數(shù)組來使用,但不管如何使用都必須要注意不能內(nèi)存越界。