2012-04-05 4 views
4

私はこのtypdefの部分を識別するのに役立つとどのような各部分は、それが使用することができますどのようにしてください:Cでこのtypedef構造体の部分を識別しますか?

  1. typedef struct作成されます。間違っがあれば

    typedef struct my_struct 
    { 
         int a; 
         int b; 
         int c; 
    } struct_int, *p_s; 
    
    struct_int struct_array[5]; 
    

    私は彼らが何を考え、pleaeが正しいです新しいタイプ。

  2. my_structはこのタイプの名前ですが、残りのコードでは使用されません。
  3. struct_intは、コードで使用できるタイプの1つのインスタンスです。
  4. *p_sは、作成した1つのインスタンスに固有のポインタです。
  5. struct_arrayは、作成したインスタンスの配列です。構造体の配列を作成するときに、なぜ我々は代わりにmy_structstruct_intを使用しない、また

(我々はすでにインスタンスを作成したので、この部分は...私を混乱させる)?

+7

私たちは一般的に_helping_宿題を持つ人が好きです。私はこれがあなたの宿題に近づいているのを恐れています。あなたはあなたの_guesses_が異なる部分について何を記入することができますか? – sarnold

+1

確かに、持ってください... –

+0

@sarnold:素敵なレジューム......... –

答えて

3

typedef structが新しいタイプを作成しています。

typedefそれぞれstruct my_structstruct my_struct*と同義でありstruct_intp_sを、定義されています。このアイデアは、物事を長い道のりで入力して読みやすさを向上させることからあなたを救うことです(必ずしもそうではありません)。

my_structはこのタイプの名前ですが、残りのコードでは使用されません。

あなたはstruct my_structとしてmy_structを使用する必要がありますが、あなたはtypedefをしたので「そのタイプを参照するためにstruct_intをDと、それは簡単です。

struct_intは、コードで使用できる1つのインスタンスです。

いいえ、上記を読んでください。 typedefを削除した場合、となり、2つの変数struct_intp_sが作成されます。

*p_sは、私たちが作成した1つのインスタンス専用のポインタです。

いいえ、上記を読んでください。

struct_arrayは、作成したインスタンスの配列です。したがって、それはタイプstruct my_structの配列だ、

struct_arrayはタイプstruct_intの配列である(我々はすでにインスタンスを作成したので、この部分は...私を混乱させる)。 インスタンスは、structの定義で作成されます。

また、構造体の配列を作成するとき、my_structの代わりにstruct_intを使用するのはなぜですか?

上記の質問と同じですが、 struct my_structまたはstruct_intstruct_intを使用すると、typedefを入力してstruct_intという目的を無効にできます。

+0

ありがとう、ありがとう。 –

4

struct my_structは、タイプの名前であり、my_structはタグ名であり、タイプではありません。

typedefはCで型を作成しませんが、既存の型の別名を作成します。

+0

エイリアスが作成されました。私が行方不明だった部分です。 –

3

struct my_struct:ここでは、オブジェクトの新しいインスタンスを作成するたびにstruct my_structと呼ばれる新しいデータ型を作成しています。たとえば、あなたが言う必要があります:struct my_struct a;ないmy_struct a;

typedef struct my_struct {} struct_int;を:ここでは、単にstruct my_structのエイリアスを作成し、struct_intという名前を付けます。これからは、struct my_struct a;の代わりにstruct_int a;と言うことができます

ここでは、struct my_structを指すデータ型の新しいエイリアスを作成します。 p_s newStruct = malloc(sizeof(struct_int));

+0

@sarnoldありがとう – GradGuy

2

my_structは、このタイプの構造体の名前です。後にこのタイプの構造を宣言するために使用することができます。

struct_intは、typedefによって作成されるエイリアスの名前です。

*p_sは、my_struct(別名struct_int)タイプの構造体へのポインタです。このタイプの構造体を指すことができます。

struct_arrayは、my_structの配列の名前です。しかし、それは別名struct_intで宣言されているので、後でそれを1と呼ぶべきです。

エイリアスは個人的な好みですが、実際にはmy_structまたはstruct_intのどちらか一方を削除することができます。

1

あなたの前提は部分的に正しいです。私はあなたがtypedefを取り出して、これを持っていた場合3.と4.

に行きたい:

struct my_struct { 
    // ... 
} struct_int_v, *p_s_v; 

次に、あなたが期待されるタイプで2つの変数struct_int_vp_s_vを宣言しているだろう(一方はstruct my_structであり、他方はstruct my_struct*である)。

ストローク指定子typedefを導入すると、宣言構文は同じですが、変数を作成せずに型を作成するように指示しています。

したがって、struct_intは、変数struct_int_vが持っているだろうとp_sstruct_int_v変数がなければならないタイプになりますタイプになります。 ;まで

(そのことについてまたはstatictypedefような記憶指定子は全て変数に適用されることに注意(例えばconst又はvolatileような他の修飾子はタイプコントラストのに適用しながら)。

+0

"宣言の構文は同じですが、変数を作成せずに型を作成するようにCに指示しています。 - それを知らなかった、ありがとう –

1

あなたはほとんどあなた自身の質問に答え、私は私が見る残りの2つの点に対処します:

まず、struct定義が作成されるタイプの名前がstruct my_structです。あなたは

struct my_struct a; 
struct my_struct b; 

のように変数を宣言することができますが、あなたはtypedefを使用してエイリアスを作成するようstructすべての時間を記述する必要がありますする必要はありません。別々の構造とエイリアスを定義するために少し明確かもしれない:

struct my_struct { 
    int a, b, c; 
}; 
typedef struct my_struct struct_int; 
typedef struct my_struct *p_s; 

この最初はstruct my_structと呼ばれるタイプを定義し、次にタイプstruct my_structの別名としてstruct_intを定義し、次いで型の別名としてp_s定義しますstruct my_struct *。あなたが書いたコードは、これらの3つすべてを1つにまとめたものですが、同じことを意味します。

第2に、タイプ別名p_sは、配列struct_arrayとは関係ありません。 *p_sは、typedefの一部であるため、構造のインスタンスを定義しません。代わりに型エイリアスを定義します。しかし、たとえtypedefがなく、p_sが実際のポインタ変数であったとしても、後で定義される配列は別個の無関係の変数です。

+0

私はあなたがそれをきれいにしたのが好きです... –

+1

'typedef'を使用して構造体型の便利なエイリアスを作成する場合、構造体名を完全に省略するのが普通です:' typedef struct {/ * .. 。* /} my_struct_type; '。同じことに対して2つの異なる名前を持つ意味はありません。 – Wyzard

+1

また、匿名構造のインスタンスを直接作成することもできます: 'struct {int a、b; } my_two_ints; '。 'typedef'がないので、これは実際の変数を定義します。興味深いのは、 – Wyzard

関連する問題