[英]type of int * (*) (int * , int * (*)())
int *(*)(int *,int *(*)())
我想知道它是什么類型的? ,有人可以舉例說明使用此類型的聲明。
任何幫助都會很棒。
謝謝。
它是一個指向函數的指針,它返回int*
並接受int*
和指向返回int*
函數的指針(並接受未定義數量的參數;請參閱注釋)。
一些例子(看起來不太好,它只是構造成包含所提到的聲明):
#include <stdio.h>
static int a = 10;
int* f1() {
return &a;
}
static int b;
int* f2(int *j, int*(*f)()) {
b = *j + *f();
// this is just for demonstrational purpose, such usage
// of global variable makes this function not thread-safe
return &b;
}
int main(int argc, char *argv[]) {
int * (*ptr1)();
int * (*ptr2) (int * , int * (*)());
ptr1 = f1;
ptr2 = f2;
int i = 42;
int *pi = ptr2(&i, ptr1);
printf("%d\n", *pi);
return 0;
}
// prints 52
cdecl
是你的朋友:
$ cdecl explain 'int * (*x) (int * , int * (*)())'
declare x as pointer to function (pointer to int, pointer to function returning pointer to int) returning pointer to int
嗯...根據cdecl.org ,這是一個語法錯誤 - 讓我試試
int * (*) (int *,int *(*)())
所以:它是一個函數指針,它有兩個參數,第一個參數是一個指向int的指針,另一個是指向函數的指針,沒有參數 - 返回指針指向int,並且它返回 - 指針到INT。
編輯:我在該網站中使用的C聲明 - 我沒有輸入變量名稱
int *(*x)(int *,int *(*)())
返回: 聲明x作為函數的指針(指向int的指針,指向函數的指針返回指向int的指針)返回指向int的指針
希望這會有所幫助,最好的問候,湯姆。
有一種稱為“左右規則”的技術可以幫助您破譯這些復雜的聲明。 該規則通過將英語關鍵字替換為聲明中出現的屬性來工作。 然后,當您將關鍵字放在一起時,構造的句子將描述聲明。
以下是您應該使用的屬性和關鍵字:
現在這是“左右規則”:
以下是一些例子:
int n[10];
標識符是n。 右邊的屬性是[10]
,因此請使用關鍵字“array of 10”。 接下來,您將獲得數據類型int
。 所以,
n是“10個整數的數組”。
int *n[10];
標識符是n。 右邊的屬性是[10]
,因此請使用關鍵字“array of 10”。 向左看,屬性是*
所以使用關鍵字“指向”。 沒有更多的屬性。 剩下的就是數據類型,即int
。 將關鍵字放在一起得到:
n是“整數10個指針的數組”。
int (*pf)();
標識符是pf。 pf右邊沒有屬性。 在pf的左邊是*
。 所以第一個關鍵字是“指向”。 接下來,返回右側,屬性為()
。 這意味着下一個關鍵字是“返回的函數”。 現在回到數據類型int
的左邊。 將關鍵字放在一起得到:
pf是“指向返回int的函數的指針”
int *(*pf)();
pf是標識符。 pf的權利沒有屬性。 左邊是*
,所以第一個關鍵字是“指向”。 回到右邊是()
,所以下一個關鍵字是“返回的函數”。 回到左邊是*
,所以下一個關鍵字是“指向”。 接下來,到達int
數據類型:
pf是“指向返回指向int的指針的函數的指針”。
下一個例子就像前一個例子一樣,但這次有一些pf函數的參數。 參數是int *x
和int *(*y)()
。 您應該能夠基於到目前為止的所有內容來描述每個參數。 一旦你這樣做,你將能夠描述整個事情:
int *(*pf)(int *x, int *(*y)());
pf是一個指向函數的指針,該函數返回一個指向int的指針。 pf有兩個參數。 第一個參數x是指向int的指針。 第二個參數y是指向返回指向int的指針的函數的指針。
typedef int* (*fptr)();
int* foo(int* p1, fptr p2);
你可以把foo
放在那種類型中。
真的使用了這樣的聲明! 考慮標准C庫的信號功能:
void (*
signal(int sig, void (*func)(int)))(int);
信號手冊頁解釋它相當於以下typedef'd版本:
typedef void (*sig_t) (int);
sig_t signal(int sig, sig_t func);
一個函數,它接受兩個args,int和一個sig_t函數,並返回舊的sig函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.