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