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