簡體   English   中英

int *(*)(int *,int *(*)())的類型

[英]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 )()) - innermost(*)() - 指向函數的指針int )() - 指向沒有參數的函數的指針,返回指向int的指針
  • (int *,...) - 兩個參數,一個是指向int的指針,另一個是指向函數的指針 - 沒有參數 - 返回指針指向int
  • (*)(...) - 帶參數的函數指針
  • int *(*)(...) - 一個函數指針返回指針到int

所以:它是一個函數指針,它有兩個參數,第一個參數是一個指向int的指針,另一個是指向函數的指針,沒有參數 - 返回指針指向int,並且它返回 - 指針到INT。

編輯:我在該網站中使用的C聲明 - 我沒有輸入變量名稱

int *(*x)(int *,int *(*)())

返回: 聲明x作為函數的指針(指向int的指針,指向函數的指針返回指向int的指針)返回指向int的指針

希望這會有所幫助,最好的問候,湯姆。

有一種稱為“左右規則”的技術可以幫助您破譯這些復雜的聲明。 該規則通過將英語關鍵字替換為聲明中出現的屬性來工作。 然后,當您將關鍵字放在一起時,構造的句子將描述聲明。

以下是您應該使用的屬性和關鍵字:

  • 當您看到屬性“()”時,使用關鍵字“返回的函數”
  • 當您看到屬性“[n]”時,請使用關鍵字“array of n”
  • 當您看到屬性“*”時,請使用關鍵字“指向”

現在這是“左右規則”:

  1. 從標識符開始。
  2. 向右查找屬性。
  3. 如果沒有找到,請向左看。
  4. 找到屬性后,替換其英語關鍵字。
  5. 當你解決問題時,繼續左右替換。
  6. 在到達聲明中的數據類型時停止。

以下是一些例子:

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 *xint *(*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.

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