2

私が次のようなものを書くと

#define INT_PTR int*
INT_PTR ptr4, ptr5, ptr6;

この場合、ptr4のみが整数へのポインターであり、残りの値(ptr5およびptr6)は整数です。彼らはどのように整数値を取っていますか?コンパイルエラーが発生するはずです。

コンパイラがptr5とptr6を整数として扱っているのはなぜこのようになっているのですか。

4

3 に答える 3

11

ポインタオブジェクトを宣言するには、次のようにします。

int *ptr4, *ptr5, *ptr6;

Cでは、トークン*は型情報に属していないため、複数のオブジェクトを宣言するときにトークンを繰り返す必要があります。これはCでよくある間違いであることに注意してください。

typedef代わりにできることは次のとおりです。

typedef int * INTPTR;
于 2012-04-07T11:47:26.527 に答える
4

#defineこれは実際には、単にテキストの置換であるとは何の関係もありません。

プリプロセッサフ​​ェーズの後(置換が行われるとき)、最終的に次のようになります。

int* ptr4, ptr5, ptr6;

また、バインドは型ではなく変数*にバインドされるため、 1つの整数ポインターと2つの整数を作成します。

これが私が書くことを好む理由です:

int *xyzzy;

それよりも:

int* xyzzy;

前者は、が変数*に属していることを明確にするためです。Cで新しい型を定義したい場合、コマンドは驚くべきことに、:-)です。typedef

typedef int * INTPTR;
INTPTR ptr4, ptr5, ptr6;

これは、マクロのようにテキストを置き換えるだけでなく、それに続くすべての変数に適用される新しいタイプを定義します。つまり、タイプINTPTR( )は、、およびint *の3つすべてに適用されます。ptr4ptr5ptr6

于 2012-04-07T11:49:49.720 に答える
1

コードは次のように展開されます

int* ptr4, ptr5, ptr6;

また、アスタリスク(*)宣言は、それに続く識別子にのみ適用されるため、実際にはptr4のみがポインターになるのは当然です。(ちなみに、それが概念的に書くのが間違っている理由です

int* ptr;

ポインタ宣言は1つの変数のみを対象としていることを示す必要があるため、次のようになります。

int *ptr.

)。

したがって、#defineプリプロセッサディレクティブ(タイプ定義でも間違っています)の代わりに、Ctypedefキーワードを使用します。

typedef int *inptr;
intptr ptr4, ptr5, ptr6;
于 2012-04-07T11:53:19.577 に答える