指針數組、數組指針分析

指針數組和數組指針

一、什麼是指針數組?

首先它是一個數組,數組的元素都是指針,數組佔多少個字節由數組本身決定。它是“存放數組的指針”。

二、什麼是數組指針?

首先它是一個指針,它指向一個數組。在32位系統下永遠佔4個字節,它指向的數組佔多少字節由該數組決定,與該數組指針無關。它是“指向數組的指針”。

三、指針數組和數組指針區分

int *p1[10];
int (*p2)[10]

以上哪個是指針數組?哪個是數組指針?
這個問題涉及到符號優先級問題,“[ ]”的優先級高於“ * ”的優先級。

  1. p1先和“[ ]”結合,構成一個數組,數組名爲p1,數組類型爲int*型,即數組10個元素爲指向int類型數據的指針,即指針數組。

  2. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章