2017-09-22 10 views
0

私はこの奇妙な方法でC言語の構造体を定義しています。typedef構造体の名前に*をつけて

typedef struct { 
     int val; 
    } *Name; 

これとの違いは何ですか?

typedef struct { 
    int val; 
} Name; 

ただし、最初と "。"に " - >"を使用する必要があります。第二に、実際に違いは何ですか?

+0

@usr、それは同じ話題の男ではありません。 –

+0

それは私の質問ではないですか? – Lurr

+1

最初の 'Name'は構造体のポインタである型です。あるタイプのポインタを隠すことは避けてください - 選択された状況でのみ有効です – chux

答えて

4

Name

typedef struct { 
    int val; 
} *Name; 

最初のケースでは、名前構造へのポインタ型の別名として宣言されます。

がこの宣言にあることをあなたは、たとえば次のよう

Name ptr = malloc(sizeof(*ptr)); 

このポインタ型を使用することができ、その後、あなたが例えば

ptr->val = 10; 

または

(*ptr).val = 10; 

を書くことができますName型のポインタptrが宣言され、オブジェクトoが動的に作成されますf構造体とポインタは、この動的に作成されたオブジェクトを指します。

Name

typedef struct { 
    int val; 
} Name; 

第2のケースでは、名前構造自体の別名として宣言されます。あなただけ

Name name; 

、その後

name.val = 10; 

か、単に

Name name = { 10 }; 

を書くことができますし、構造型のオブジェクトが作成されます。この型のオブジェクトを宣言する

それとも、構造型のオブジェクトを割り当てたい場合は、動的にあなたがここにそれをより明確にするために

Name *ptr = malloc(sizeof(Name)); 

を書くことができますがtypedefでの別の使用例です。

typedef int A[10]; 

この型定義は、配列型int[10]の別名として名前Aを宣言する。その

A a; 

この宣言はint[10]と等価であるタイプAの配列オブジェクトaを宣言した後

次のように書くことができます。

この宣言

typedef int (*A)[10]; 

int[10]の配列へのポインタ型に別名として名前Aを宣言する。

この宣言は、あなたが、名前Nameは現在一つの要素でstructを指し、」int言っている

typedef struct { 
    int val; 
} Name; 

を書くとき、たとえば次のよう

int a[10]; 
A ptr_a = &a; 
+0

「*」を使用する場合、mallocを使用してインスタンス化する必要がありますが、私は単に名前の名前を言うことができます。 name.val = 3?何故ですか?感謝の男 – Lurr

+0

@Lurr私の更新されたposを見てください。 –

+0

おかげさまで、別の質問がありましたら、sizeofの引数は* ptrです。sizeof * Nameよりも重要ですか? – Lurr

4

を使用することができますvalという名前です。

あなたは

typedef struct { 
    int val; 
} *Name; 

を書くとき、これは「名前Nameは今1人のメンバー、valという名前intstructポインタを指します。」と言うように、星が意味を変更しますこのため、ドットではなく矢印演算子を使用する必要があります。最初のケースでは、Nameは正直な、正直な構造のタイプで、2番目のフィールドでは、構造体へのポインタ型のNameです。

関連する問題