2016-08-14 58 views
1

我無法理解下面的語法中最裏面的「int」是什麼意思。在這個表達式中int的含義

int(*(*ptr (int))(void) 

我這種表達的理解說,ptr是一個函數指針會變成沒有爲它的參數(從表達的空白部分),並返回一個int(從開頭爲int)。但ptr之後的int是什麼意思?

編輯:道歉,但在問題文件本身的問題是misprinted。這裏的表達

int (*ptr (int))(void) 
+0

我寫了一個例子,但是你編輯了你的問題(在寬限期內,所以它不在編輯歷史中)並且改變了語法。你確定這次是否正確? 'ptr'不是這裏的指針,所以它可能仍然是錯誤的。 – user2357112

+2

實際上,新版本中的圓括號甚至不匹配,所以肯定是錯誤的。 – user2357112

+0

@ user2357112:我剛剛複製了表達式,它與問題論文中的方式完全相同。但是,是的,現在我發現這個問題有些問題。開合支架的數量不相等。你怎麼看呢? –

回答

5

從C標準,該signal()功能有相當複雜的簽名:

void (*signal(int sig, void (*func)(int)))(int); 

signal()函數有兩個參數,一個int和指向一個函數,它的int參數並返回void;它返回一個指向一個函數的指針,該函數採用int參數,並返回void - 與第二個參數類型相同。

這比你的代碼更復雜,但它可以減少你的例子,那就是:

int (*ptr(int))(void); 

工作一步一步:

void (*signal(int sig, void (*func)(int)))(int); 
void (*signal(int sig))(int); // Remove second argument 
void (*signal(int))(int);  // Remove argument name 
int (*signal(int))(int);  // Change return type 
int (*ptr(int))(int);   // Change name of function 
int (*ptr(int))(void);  // Remove argument of returned pointer to function 

因此,在上下文中,這意味着您的語句是一個聲明ptr是一個函數,它需要一個參數int並返回一個指向不帶參數並返回int值的函數的指針。該函數的實現(定義)將爲內部int提供參數名稱。

示例代碼 - 與ptr更名爲function

#include <stdio.h> 
#include <stdlib.h> 

static int counter(void) { static unsigned short val = 0; return ++val; } 

static int (*function(int arg))(void) 
{ 
    switch (arg) 
    { 
    case 0: 
     return rand; 
    default: 
     return counter; 
    } 
} 

int main(void) 
{ 
    int (*func)(void); 

    func = function(0); 
    printf("F() = %5d\n", func()); 
    printf("F() = %5d\n", func()); 
    printf("F() = %5d\n", func()); 

    func = function(1); 
    printf("F() = %5d\n", (*func)()); 
    printf("F() = %5d\n", (*func)()); 
    printf("F() = %5d\n", (*func)()); 

    return 0; 
} 

輸出示例:

F() = 16807 
F() = 282475249 
F() = 1622650073 
F() =  1 
F() =  2 
F() =  3 

我假設我可以添加assert(sizeof(unsigned short) != sizeof(int));

+0

你有一個'int',你應該有一個'void'。 – user2357112

+0

@ user2357112:謝謝。 –