2016-04-14 7 views
1

だから私は、次の2つの機能が与えられた場合:cで他の関数を割り当てることができる関数ポインタである変数を定義する方法は?

void printhex(int x, char y, char z) 
{ 
    printf("%x%x%x,x,y,z); 
} 
void printdecimal(int x, char y ,char z) 
{ 
    printf("%i%i%i,x,y,z); 
} 

私は、変数を定義する方法、それは2つの与えられた機能のいずれかを割り当てることができる関数ポインタ、ありますか?

また、メイン関数内で、プログラム実行時にプログラム名の後にコマンドライン引数が入力されたかどうかを判断する方法はありますか。何かが入力された場合、どのように関数ポインタを関数printhexに代入することができますか?それ以外の場合は関数をprintdecimalに代入しますか?あなたが同様に変数を宣言することができ

+0

[Function Pointer in C]の重複可能性(http://stackoverflow.com/questions/1278841/function-pointer-in-c) –

答えて

1

A1)これは、関数ポインタは次のようになります方法です:あなたは、このようにそれに機能を割り当てる

void (*myFuncPtr)(int, char, char); 

myFuncPtr = &printhex; 

そして、このようにそれを呼び出す:

(*myFuncPtr)(1, 'a', 'b'); 

A2)main()の変数argcは、コマンドラインにプログラム名自体以外のrgumentsが入力されました。 argc > 1の場合、プログラムを呼び出すときにargc - 1の他の文字列が渡されました。これは、argcもプログラム名をパラメータの1つとしてカウントするためです。したがって、このような何かがあなたのために働く必要があります。

void (* ptr)(int, char, char); 
ptr = printhex; 

(*ptr)(a, b, c); //this will call the function 
2

:&を完全に任意である

printSomething = &printhex; 

又は

printSomething = &printdecimal; 

void (*printSomething)(int, char, char); 

あなたとそれらの機能のいずれかに割り当てることができたとえば、printSomething = printhex;と書くこともできます。

また、要求していないが、あなたは(例えば)でポインタを使用して関数を呼び出すことができます。

(*printSomething)(1, 2, 3); 

*もオプションなので、あなただけ書くことができる:

printSomething(1, 2, 3); 

コマンドライン引数についても助けが必要な場合は、別の質問でなければなりません。

1

私が正しくあなたを理解していれば、それは簡単でなければならないのtypedef

void printhex(int x, char y, char z) { 
     printf("%x%x%x",x,y,z); 
} 

void printdecimal(int x, char y ,char z) { 
     printf("%i%i%i",x,y,z); 
}  

typedef void (*printer)(int x, char y ,char z); 

printer hex = &printhex; 
printer dec = &printdecimal; 
1

を使用します

void (*fptr)(int, char, char); 

次にassigneダ値:

fptr = printhex; 

と機能を呼び出すために使用:

fptr(13, 'a', 'b'); 

それとも、関数の型の新しい名前を宣言することがあります。

typedef void (*PrintFuncPtr)(int, char, char); 

その後、変数宣言のためにそれを使用します:

PrintFuncPtr fptr; 
0

このような変数として宣言されます:

if (1 < argc) 
{ 
    myFuncPtr = &printhex; 
} 
else 
{ 
    myFuncPtr = &printdecimal; 
} 
0

defi NE関数ポインタを使用して、次の構文を使用します。この場合には

return-type (*pointer name)(parameters);

を、あなたが使用します。 void (*fp)(int, char, char);をあなたが定義した二つの機能に適したfpをという名前の関数ポインタのために。

関数ポインタの割り当ては、関数の名前を使用する以外は、他のポインタと同様に行うことができます。たとえば、fp = printhex;は、printhexのアドレスをポインタfpに割り当てて、それが言うことを正確に行います。 printhexには&演算子を使用する必要はありません。これは、暗黙的にポインタが関数へ変換されるためです。

関連する問題