0

私は何が問題なのか理解しようとしています:

typedef *void (*pfun)(**int, *float);

私が理解している限り、問題は関数にポインターを渡すことができないということです

typedef *void (*pfun)(int, float);

エラーは発生しませんが、なぜそうなるのかわかりません。

4

4 に答える 4

1

次の式のポインタ宣言に有効な 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.
于 2013-08-08T18:18:28.717 に答える
0

これは、新しいプログラマーにとって良い質問です。逆参照演算子には、ポインターの定義にいくつかの用途があります。

まず、変数名の前に置くことができます。これは、変数が次のようなデータ型へのポインターであることを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.

お役に立てれば。

于 2013-08-08T18:39:55.533 に答える