指針數組和數組指針
一、什麼是指針數組?
首先它是一個數組,數組的元素都是指針,數組佔多少個字節由數組本身決定。它是“存放數組的指針”。
二、什麼是數組指針?
首先它是一個指針,它指向一個數組。在32位系統下永遠佔4個字節,它指向的數組佔多少字節由該數組決定,與該數組指針無關。它是“指向數組的指針”。
三、指針數組和數組指針區分
int *p1[10];
int (*p2)[10]
以上哪個是指針數組?哪個是數組指針?
這個問題涉及到符號優先級問題,“[ ]”的優先級高於“ * ”的優先級。
p1先和“[ ]”結合,構成一個數組,數組名爲p1,數組類型爲int*型,即數組10個元素爲指向int類型數據的指針,即指針數組。
p2先和” * “結合,說明p2是一個指針變量,它指向一個有10個int類型元素的匿名數組。即數組指針。
如圖所示:
四、二級指針參數和二維數組參數
當二級指針和二維數組在一起時經常令人難以區分,例如:
char **p; //這句代碼定義了一個指向一級指針的地址的指針p,
//所以在32位系統下也佔4個byte
而下面的例子則講述它們作爲參數時的區別:
void fun(char a[3][4]); //可以把a[3][4]看做一個一維數組a[3],
//每個元素都是一個含有4個char類型數據的數組。
void fun(char (*p)[4]); //編譯器把p解析爲一個指向包含4個char類型數據元素的數組
//即移位數組a[3]的元素
作爲參數時,第一個[ ]內的數字可以省略:
void fun(a[][4]);
void fun(char **p);
由以上代碼得出二維數組參數和二維指針參數的等效關係:
- char a[3][4]——–char (*p)[4]
- char *a[10]——char**p