2016-08-14 4 views
1

次の構文で最も内側の「int」が意味することを正確に理解できませんでした。この式のintの意味

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

この式の私の理解では、ptrが関数ポインタであることを述べているから(intを(式の空隙部から)その引数に何もとらず、返します最初はint)。しかし、ptrの後のintの意味は?

編集:謝罪するが、質問用紙自体の質問は誤っていた。ここではCの標準からの発現

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

私は例を書きましたが、あなたの質問を編集しました(猶予期間中は編集履歴にないので)、構文を変更しました。あなたは今度はそれが正しいと確信していますか? 'ptr'はここではポインタではないので、まだ間違っているようです。 – user2357112

+2

実際、カッコは新しいバージョンでも一致しないので間違っています。 – user2357112

+0

@ user2357112:私は式をコピーしました。それは質問用紙とまったく同じです。しかし、はい、今私は何かがこの質問に間違っていることがわかります。開閉括弧の数は等しくありません。どう思いますか? –

答えて

5

だ、signal()機能はかなり複雑なシグネチャがあります。

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

signal()関数は2つの引数、intintを取る関数へのポインタを取ります引数を返し、voidを返します。 int引数をとり、その第2引数と同じ型の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 

をので、文脈で、その意味あなたのステートメントはptrint引数をとり、引数を取らずにintの値を返す関数へのポインタを返す関数であるという宣言であることを確認してください。関数の実装(定義)は、内部に引数名を与えますint

#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; 
} 

出力例:私はassert(sizeof(unsigned short) != sizeof(int));を追加できると仮定してい

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

functionに改名ptrと -

サンプルコード。

+0

あなたは 'void'を持つべきint型を持っています。 – user2357112

+0

@ user2357112:ありがとうございます。 –

関連する問題