指標陣列 陣列指標 指標函式 函式指標的區別

2021-07-23 09:48:55 字數 3432 閱讀 6996

**:這個地方

int*p[4

];         // 

指標陣列。

是個有4

個元素的陣列,

每個元素的是指向整型的指標。 

( 陣列的每個元素都是指標 

)int

(*p)[4];

// 陣列指標。

它是乙個指標,指向有

4個整型元素的陣列。

( 乙個指標指向有 4 個整型元素的陣列 

)int

*func(

void

);   // 

指標函式。

無參函式,

返回整型指標。           

( 函式的返回值為 int* 

)int

(*func)(

void

); // 

函式指標,可以指向無參,

且返回值為整型指標的函式。

( 函式的返回值為 int 

)從未定義的識別符號開始閱讀,是因為乙個宣告裡面可能有多個識別符號,但未定義的識別符號只會有乙個。

現在通過一些例子來討論右左法則的應用,先從最簡單的開始,逐步加深:

int(*func)(

int*p);

首先找到那個未定義的識別符號,就是func,它的外面有一對圓括號,而且左邊是乙個 * 

號,這說明 func 是乙個指標,然後跳出這個圓括號,先看右邊,也是乙個圓括號,這說明 

(*func

) 是乙個函式,而 func 是乙個指向這類函式的指標,就是乙個函式指標,這類函式具有 int

* 型別的形參,返回值型別是 int。

int(*func)(

int*p,

int(*f)(

int*));

func 被一對括號包含,且左邊有乙個 * 

號,說明 func 是乙個指標,跳出括號,右邊也有個括號,那麼 func 是乙個指向函式的指標,這類函式具有 int

* 和int

(*)(

int*) 

這樣的形參,返回值為 int 型別。再來看一看 func 的形參 int(*f

)(int

*),類似前面的解釋,f 也是乙個函式指標,指向的函式具有 int

* 型別的形參,返回值為 int。

int(*func[

5])(

int*p);

func 右邊是乙個  

運算子,說明 func 是乙個具有 5 個元素的陣列,func 的左邊有乙個 *

,說明 func 的元素是指標,要注意這裡的 * 

不是修飾 func的,而是修飾 func[5] 

的,原因是  

運算子優先順序比 

* 高,func先跟 

結合,因此 

* 修飾的是 func[5

]。跳出這個括號,看右邊,也是一對圓括號,說明 func 陣列的元素是函式型別的指標,它所指向的函式具有 int

* 型別的形參,返回值型別為 

int。

int(*(*func)[

5])(

int*p);

func 被乙個圓括號包含,左邊又有乙個 *

,那麼 func 是乙個指標,跳出括號,右邊是乙個  

運算符號,說明 func 是乙個指向陣列的指標,現在往左看,左邊有乙個 * 

號,說明這個陣列的元素是指標,再跳出括號,右邊又有乙個括號,說明這個陣列的元素是指向函式的指標。總結一下,就是:func 是乙個指向陣列的指標,這個陣列的元素是函式指標,這些指標指向具有 int

* 形參,

返回值為 int 型別的函式。

int(*(*func)(

int*p))[5];

func 是乙個函式指標,這類函式具有 int

* 型別的形參,返回值是指向陣列的指標,所指向的陣列的元素是具有5個int 元素的陣列。

要注意有些複雜指標宣告是非法的,例如

: int func(

void)[

5];func 是乙個返回值為具有 5 個 int 元素的陣列的函式。但 c 語言的函式返回值不能為陣列,這是因為如果允許函式返回值為陣列,那麼接收這個陣列的內容的東西,也必須是乙個陣列,但c/c++ 語言

的陣列名是乙個右值,它不能作為左值來接收另乙個陣列,因此函式返回值不能為陣列。

int func[5](

void);

func 是乙個具有 5 個元素的陣列,這個陣列的元素都是函式。這也是非法的,因為陣列的元素除了型別必須一樣外,每個元素所占用的記憶體空間也必須相同,顯然函式是無法達到這個要求的,即使函式的型別一樣,但函式所占用的空間通常是不相同的。

實際當中,需要宣告乙個複雜指標時,如果把整個宣告寫成上面所示的形式,對程式可讀性是一大損害。應該用 typedef 

來對宣告逐層

分解,增強可讀性,例如對於宣告:

int(*(*func)(

int*p))[5];

可以這樣分解:

typedef

int(*para)[5];

typedef

para(*

func)(

int*);

這樣就容易看得多了。

int(*(*func)[5][

6])[7][

8];func 是乙個指向陣列的指標,這類陣列的元素是乙個具有 5×6 個 int 元素的二維陣列,而這個二維陣列的元素又是乙個二維陣列。

如下,typedef

的分解方法:

typedef

int(*para)[7][

8];typedef

para(*

func)[5][

6];int(*(*(*func)(

int*))[

5])(

int*);

func 是乙個函式指標,這類函式的返回值是乙個指向陣列的指標,所指向陣列的元素也是函式指標,指向的函式具有int

* 形參,返回值為int。

typedef

int(*

para1)(

int*);

typedef

para1(*

para2)[5];

typedef

para2(*

func)(

int*);

int(*(*func[7][

8][9])(

int*))[5];

func 是乙個陣列,這個陣列的元素是函式指標,這類函式具有 int

* 的形參,返回值是指向陣列的指標,所指向的陣列的元素是具有 5 個int 元素的陣列。

typedef

int(*

para1)[5];

typedef

para1(*

para2)(

int*);

typedef

para2 func[7][

8][9];

指標陣列 陣列指標 函式指標 函式指標陣列

陣列指標 指向陣列的指標,是乙個指標,其指向的型別是陣列 指標陣列 元素為指標的陣列,是乙個陣列,其中的元素為指標。例如 int a 5 這個是陣列指標。int a 5 這個是指標陣列。定義函式指標型別 int max int,int typedef int fun ptr int,int 申明變數...

指標陣列,陣列指標,指標函式,函式指標

int p 4 指標陣列。是個有4個元素的陣列,每個元素的是指向整型的指標。int p 4 陣列指標。它是乙個指標,指向有4個整型元素的陣列。int func void 指標函式。無參函式,返回整型指標。int func void 表示函式指標,可以指向無參,且返回值為整型指標的函式。右左規則 因為...

陣列指標,指標陣列,函式指標,指標函式

陣列指標,指標陣列,函式指標,指標函式 指標 變數,存放變數的位址。例 int ptr,ptr是乙個指向整形變數的指標 陣列 例 int a 10 定義了乙個具有10個元素的一維陣列,其中陣列的每個元素是乙個int型別。陣列指標 陣列首元素位址的指標,即是指向陣列的指標。例 int ptr 10 c...