次の構文で最も内側の「int」が意味することを正確に理解できませんでした。この式のintの意味
int(*(*ptr (int))(void)
この式の私の理解では、ptr
が関数ポインタであることを述べているから(int
を(式の空隙部から)その引数に何もとらず、返します最初はint
)。しかし、ptr
の後のint
の意味は?
編集:謝罪するが、質問用紙自体の質問は誤っていた。ここではCの標準からの発現
int (*ptr (int))(void)
次の構文で最も内側の「int」が意味することを正確に理解できませんでした。この式のintの意味
int(*(*ptr (int))(void)
この式の私の理解では、ptr
が関数ポインタであることを述べているから(int
を(式の空隙部から)その引数に何もとらず、返します最初はint
)。しかし、ptr
の後のint
の意味は?
編集:謝罪するが、質問用紙自体の質問は誤っていた。ここではCの標準からの発現
int (*ptr (int))(void)
だ、signal()
機能はかなり複雑なシグネチャがあります。
void (*signal(int sig, void (*func)(int)))(int);
signal()
関数は2つの引数、int
とint
を取る関数へのポインタを取ります引数を返し、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
をので、文脈で、その意味あなたのステートメントはptr
がint
引数をとり、引数を取らずに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
と -
サンプルコード。
あなたは 'void'を持つべきint型を持っています。 – user2357112
@ user2357112:ありがとうございます。 –
私は例を書きましたが、あなたの質問を編集しました(猶予期間中は編集履歴にないので)、構文を変更しました。あなたは今度はそれが正しいと確信していますか? 'ptr'はここではポインタではないので、まだ間違っているようです。 – user2357112
実際、カッコは新しいバージョンでも一致しないので間違っています。 – user2357112
@ user2357112:私は式をコピーしました。それは質問用紙とまったく同じです。しかし、はい、今私は何かがこの質問に間違っていることがわかります。開閉括弧の数は等しくありません。どう思いますか? –