簡體   English   中英

函數指針的聲明

[英]Declaration of function pointers

  1. 要使用typedef聲明函數指針,將類似於:

    typedef void (*FOO)(int i)

    但是通常, typedef的語法如下:

    typedef int BOOL

    那么為什么第一個不是:

    typedef void (*)(int) FOO

  2. 要返回一個函數指針(不帶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被視為類似於externstatic的存儲類說明符,盡管其含義非常不同。 它不會改變聲明的結構。 它只是更改了編譯器解釋該聲明的方式。 在上面添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM