0

コードウォークスルーで他のいくつかのコードを見つけました* これは何ですか?

これはそのコードの同じプロトタイプであり、エラーは発生していません。警告のみが付属してgcc 4.5.2いますが、Windowsでは警告が表示されず、正しくコンパイルされます。会社のIPが原因で実際​​のコードを提供できませんが、これがどのように、そしてなぜ正しいのか知りたいのですが?

#include<stdio.h>

typedef enum e
{
        a,
        b,
        c
}x,*y;

int main()
{
        x t=4;
        printf("x : %d\n",t);
        y m=5;
        printf("*y : %d\n",m);
        return 0;
}
4

3 に答える 3

6

これは次と同等です:

typedef enum e *y;

yのエイリアスもそうです。enum e *つまり、へのポインタとしてy m宣言します。次のコードは実際に期待どおりに機能します。menum e

#include <stdio.h>

x t = 4;
printf("x : %d\n", t);
y m = &t;
printf("*y : %d\n", *m);
于 2012-11-06T12:46:14.230 に答える
5

これは、一般的なパターンの特殊なケースであり、typedef TYPE * NAME「この時点から、NAME「ポインタ」型のエイリアスであることを意味しますTYPE。ここでTYPEは、任意の有効な型宣言を使用できます。

一般に、このようなアスタリスクを削除することには反対ですtypedef。これは、型を使用するコードが非常に混乱するためです。Cのポインターは非常に重要であり、値があるのか​​、それとも値へのポインターがあるのか​​を知ることはしばしば良いことであり、この方法はその事実を隠します。

于 2012-11-06T12:48:22.213 に答える
2

これは(この使用法では)服従演算子ではなく、へのポインターenum eです。

警告が表示される理由は、おそらく次の行です。

y m=5;

ポインタに整数を割り当てています。あなたはそれにアドレスを割り当てる必要があります:

y m=&t;
于 2012-11-06T12:49:32.317 に答える