區(qū)別:對指針數(shù)組來說,首先它是一個數(shù)組,數(shù)組的元素都是指針,也就是說該數(shù)組存儲的是指針,數(shù)組占多少個字節(jié)由數(shù)組本身決定;而對數(shù)組指針來說,首先它是一個指針,它指向一個數(shù)組,也就是說它是指向數(shù)組的指針,在 32 位系統(tǒng)下永遠(yuǎn)占 4 字節(jié),至于它指向的數(shù)組占多少字節(jié),這個不能夠確定,要看具體情況。
本教程操作環(huán)境:windows7系統(tǒng)、c99版本、Dell G3電腦。
一、數(shù)組指針和指針數(shù)組的定義
1.指針數(shù)組:定義 int *p[n];
指針數(shù)組可以說成是”指針的數(shù)組”,由于*p沒有括號,首先這個變量是一個數(shù)組,其次,”指針p”修飾這個數(shù)組,意思是說這個數(shù)組的所有元素都是指針類型,而指針?biāo)嫉淖止?jié)數(shù)和其類型無關(guān),只與系統(tǒng)有關(guān),在32位系統(tǒng)下,任何類型的指針占據(jù)4個字節(jié),在64位系統(tǒng)下,任何類型的指針占據(jù)8個字節(jié)。
由于()的優(yōu)先級高,首先說明p是一個int類型指針,它是指向一個整型(int)的一維數(shù)組,這個一維數(shù)組的長度是n,也可以說是總共有n個格子。數(shù)組指針也稱指向一維數(shù)組的指針,亦稱行指針。
數(shù)組指針也可以稱為“數(shù)組的指針”,首先這個變量是一個指針,其次,”數(shù)組”修飾這個指針,意思是說這個指針存放著一個數(shù)組的首地址,或者說這個指針指向一個數(shù)組的首地址。
二、數(shù)組指針和指針數(shù)組的使用
首先定義一個數(shù)組指針,既然是數(shù)組的指針,說明是用指針p去指向一個一維數(shù)組,即:
int (*p)[[4]]; //這里定義int類型,p是一個指針,指向一維數(shù)組的首地址,這個一維數(shù)組大小為4
也就是說,int類型的指針p指向int [[4]]的數(shù)組,而數(shù)組的每一個元素是一個int類型的變量。
數(shù)組指針本質(zhì)是一個指針,而指針的作用就是用來指向變量的地址,所以數(shù)組指針一般可以這樣使用(示例):
void fun(int (*P)[4]); //子函數(shù)中的形參,數(shù)組指針 a[3][4] = {0}; //主函數(shù)中定義的二維數(shù)組 fun(a); //主函數(shù)調(diào)用子函數(shù)的實(shí)參,是二維數(shù)組的首元素首地址
對于指針數(shù)組,也就是“指針的數(shù)組”,說明這個數(shù)組的所有元素都是指針類型。不妨定義指針p,例如:
int *p[[4]]; //這里數(shù)組長度為4,所有元素均為int類型的指針
代碼如下(示例):
void Fun(char** str); //子函數(shù)中的形參,指針數(shù)組 int main() { int arr[3][4]; char* str = "abc"; char** q = &str; }
指針數(shù)組和數(shù)組指針參數(shù)傳遞問題
傳遞的參數(shù) | 匹配需要的形參 |
---|---|
int *p[4] | int **p(指針數(shù)組或者二級指針) |
int (*p)[4] | int (*p)[4](不變) |
int [3][4] | int (*p)[4](數(shù)組指針) |
int **p | int **p(不變) |
三、實(shí)際使用的例子
例子:使用指針數(shù)組打印出:“sun wu kong”
// 代碼塊 打印“sun wu kong” char str1[] = { 's', 'u', 'n' , '