![](/img/trans.png)
[英]Declaration, allocation and assignment of an array of pointers to function pointers
[英]Declaration of function pointers
要使用typedef
聲明函數指針,將類似於:
typedef void (*FOO)(int i)
但是通常, typedef
的語法如下:
typedef int BOOL
那么為什么第一個不是:
typedef void (*)(int) FOO
要返回一個函數指針(不帶typedef
),語法如下:
void (*foo(char c))(int)
這意味着foo
接受一個char並返回指向函數的指針,該函數接受一個int且不返回任何內容。 語法太奇怪了! 看起來foo
接受一個int卻什么也不返回。 括號似乎不在正確的位置。 如果要返回函數指針,為什么不是這樣:
(void (*)(int)) foo(char c)
這非常簡單。 我在這里很難理解語法,更不用說使用它了。 有人可以解釋一下這是怎么回事嗎?
整數就是:
int x;
上面的名稱由以下方式給出:
typedef int x_type;
指向int
的指針是:
int *p;
它的類型是:
typedef int *p_type;
名為foo
的函數接受double``and returning an
int是:
int foo(double);
定義foo
的類型將是:
typedef int foo_type(double);
現在指向上面的指針應該使用*
,但是()
(函數調用)的綁定比*
(取消引用)更緊密,因此,括號是:
typedef int (*ptr_to_foo_type)(double);
這樣寫可能更好:
typedef foo_type *ptr_to_foo_type;
有些人建議寫清楚。
這個想法是類型描述看起來(有點)像它的用法。 在給定前綴/后綴運算符的情況下,很多人都同意這一觀點。 但是現在改變為時已晚。
聲明語法基於表達式的類型,而不是對象。 另一種說法是“聲明模仿使用”。
讓我們從一個簡單的指針表達式開始; 稱之為iptr
。 iptr
指向整數值。 如果要訪問該值,則需要使用一元*
運算符取消對 iptr
的引用 ,如下所示:
x = *iptr;
表達式 *iptr
類型為int
,因此寫了iptr
的聲明
int *iptr;
如果要為int
指針創建typedef,則可以添加typedef
以獲取
typedef int *iptr;
iptr
現在充當類型“ pointer to int
”的同義詞,因此您可以編寫
iptr ip;
它將ip
聲明為指向int
的指針(通常,您確實不想在typedef中隱藏指針)。
現在,假設您有一個指向帶有兩個int
參數並返回一個int
值的函數的指針,將其稱為fp
。 要調用該函數,請取消引用指針並將必要的參數傳遞給結果函數,如下所示:
x = (*fp)(arg1, arg2); // C allows you to omit the * in the call, so you could
// also write it as simply x = fp(arg1, arg2), but we're
// leaving it in so the following explanation makes sense
函數call ()
運算符的優先級高於一元*
; *fp()
將被解釋為*(fp())
,這不是我們想要的。 要在調用fp
指向的函數之前取消對fp
引用,我們必須將*
運算符與fp
明確組合在一起。
表達式 (*fp)(arg1, arg2)
為int
,因此fp
的聲明變為
int (*fp)(int arg1, int arg2);
現在讓我們看第二個示例: foo
是一個函數,該函數采用char
參數,並返回指向帶int
參數並返回void
的函數的指針。 你會這樣稱呼它
(*foo(c))(x);
同樣, 表達式 (*foo(c))(x)
為void
,因此聲明為
void (*foo(char c))(int x);
出於語法原因, typedef
被視為類似於extern
或static
的存儲類說明符,盡管其含義非常不同。 它不會改變聲明的結構。 它只是更改了編譯器解釋該聲明的方式。 在上面添加typedef
,如
typedef void (*foo(char c))(int x);
現在為類型“函數返回指向函數返回void
指針”創建同義詞foo
。 它與簡單的類型定義一樣,沒有什么不同
typedef int *iptr;
表現。
1)typedef的語法是對該類型的變量進行聲明,並將typedef
放在其前面。
2)聲明的語法與實際獲取該類型的值的語法相呼應。 請參閱我最近有關尋址運算符(包括函數調用)優先級的其他答案,例如(* twod)[3] vs *(twod)[3] C指針 ...我不想再重復一遍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.