私は何が問題なのか理解しようとしています:
typedef *void (*pfun)(**int, *float);
私が理解している限り、問題は関数にポインターを渡すことができないということです
typedef *void (*pfun)(int, float);
エラーは発生しませんが、なぜそうなるのかわかりません。
私は何が問題なのか理解しようとしています:
typedef *void (*pfun)(**int, *float);
私が理解している限り、問題は関数にポインターを渡すことができないということです
typedef *void (*pfun)(int, float);
エラーは発生しませんが、なぜそうなるのかわかりません。
次の式のポインタ宣言に有効な C/C++ 構文を使用していません:
typedef *void ( *pfun )( **int, *float );
リコール:ポイントは次の形式で宣言されます。
datatype *identifier
...したがって、型定義は次のように記述する必要があります。
typedef void* (*pfun)( int**, float* );
注意:ポインタを宣言する場合、間隔は問題にならないため、以下は同等です。
datatype *identifier
datatype* identifier
...しかし、ほとんどのプログラマーは、識別子がデータ型へのポインターであることを伝えるため、最初のポインター宣言を行うことをお勧めします。このプラクティスは、1 行で複数のポインターを宣言する場合に明らかに役立ちます。例:
int *ptr1, *ptr2, *ptr3; // Declaring 3, valid, pointers to integers.
int* ptr1, ptr2, ptr3; // Declares 1, valid, pointer to an integer and 2 other integers.
これは、新しいプログラマーにとって良い質問です。逆参照演算子には、ポインターの定義にいくつかの用途があります。
まず、変数名の前に置くことができます。これは、変数が次のようなデータ型へのポインターであることをint *X;
意味します。 X が整数値を含む RAM を指すことを意味します。
第 2 に、キャスト ステートメントの一部として独立しているように見える場合があります。(int *) Y
これは、 の内容がY
整数へのポインターとして解釈されることを意味します。
3 つ目は、関数へのポインターを示すことです。例えば、
int (*func_ptr_ret_int)(void);
func_ptr_ret_int
変数がパラメーターをとらず、整数を返す関数を指すことを C に宣言します。この例では、 にfunc_ptr_ret_int
はまだ値が割り当てられていないため、ガベージが含まれていると想定する必要があります。
4 番目の使用法は、ダブル ポインターを示すことint **Z;
です。Z が別のポインター (名前なし) を指し、それが整数を指すことを宣言します。
最後に、typedef
「ネイティブに」宣言をコーディングできるようになるまで、using ステートメントを延期することをお勧めします。つまりtypedef
、新しいデータ型を定義するだけで、ストレージの割り当てや値の割り当ては行いません。
これを念頭に置いて、2 つのステートメントを次のようにコーディングできます。
void (*pfun1)(int **, float *); // pfun1 points to a function that returns void
// and uses a double ptr to inf and ptr to float
void *(*pfun2)(int, float); // pfun2 points to a function that returns a void
// pointer and accepts int and float parameters.
お役に立てれば。