**:這個地方
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...