2016-04-12 4 views
1

this(精神病者の答え)を読んでいるうちに、関数ポインタを型定義して呼び出す方法を理解しました。しかし、私は彼ら少しで実験しても、このような機能を呼び出すことができたのtypedefについて考えた後:関数へのポインタ - 別の宣言のアプローチ

typedef void func(unsigned char); 
void test(unsigned char a); 

int main() 
{ 
    unsigned char b=0U; 
    func *fp=&test; 
    while(1) 
    { 
     fp(b); 
     b++; 
    } 
} 

void test(unsigned char a) 
{ 
    printf("%d",a); 
} 

私は関数ポインタの構文と、このアプローチを使用しての違いは何である得ることはありませんか?両方ともほぼ同じ機能を発揮するようです。

+2

ここでは関数ポインタが関与していないという印象を受けていますか?関数ポインタを作成しています。それはわずかに異なる構文です。 – user2357112

+6

'func * fp'は関数ポインタではないと思いますか? – WhozCraig

+0

これはどのように "関数ポインタなし" *ですか? –

答えて

4

スタイル

typedef void func_t (void); 
... 
funct_t* fp; 

関数ポインタを宣言するための明確な方法の一つです。クリア今度はあまり読み

void (*fp)(void); 
に相当する
typedef void (*func_t)(void); 
func_t fp; 

少し読みにくくと等価であるC.

のポインタ構文の残りの部分と一致しているので、

最初のスタイルの利点は、これらを関数にパラメータとして渡すと明らかになります。

1) void sort (func_t* callback);  // very clear and readable! 
2) void sort (func_t callback);  // hmm what is this? passing by value? 
3) void sort (void(*callback)(void)); // unreadable mess 

一般に、typedefの背後にあるポインタの構文を隠すのは悪い考えです。関数ポインタも例外ではありません。

+0

そう思った。 UINT8 * u8ptrのようなものを8ビットのメモリを占有するポインタを指すポインタとして解釈するのは非常に簡単です(または私はこれに慣れています)。あなたの第1のケースの等価関数ポインタバージョンは、次のように解釈されます:funct_t型を指すポインタ(パラメータを取らず何も返さない関数) –

3

あなたはfuncは、関数ポインタとして声明typedef編だったら、他の方法が

typedef void (*func)(unsigned char); 
func fp = &test; // Notice, no '*' in the declaration? 
+0

だから私はちょうど*を動かす。 'typedef void(func)(unsigned char);の構文はまだ –

+0

のままです;'正しいかどうか? – BlackMamba

1

、ポインタをtypedefのことであろう、すなわち

func *fp = &test; // fp is a function pointer! 

宣言と関数ポインタを作成している

func fp=&test; 
関連する問題