私はこの奇妙な方法でC言語の構造体を定義しています。typedef構造体の名前に*をつけて
typedef struct {
int val;
} *Name;
これとの違いは何ですか?
typedef struct {
int val;
} Name;
ただし、最初と "。"に " - >"を使用する必要があります。第二に、実際に違いは何ですか?
私はこの奇妙な方法でC言語の構造体を定義しています。typedef構造体の名前に*をつけて
typedef struct {
int val;
} *Name;
これとの違いは何ですか?
typedef struct {
int val;
} Name;
ただし、最初と "。"に " - >"を使用する必要があります。第二に、実際に違いは何ですか?
名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;
を使用することができますval
という名前です。
あなたは
typedef struct {
int val;
} *Name;
を書くとき、これは「名前Name
は今1人のメンバー、val
という名前int
でstruct
にポインタを指します。」と言うように、星が意味を変更しますこのため、ドットではなく矢印演算子を使用する必要があります。最初のケースでは、Name
は正直な、正直な構造のタイプで、2番目のフィールドでは、構造体へのポインタ型のName
です。
@usr、それは同じ話題の男ではありません。 –
それは私の質問ではないですか? – Lurr
最初の 'Name'は構造体のポインタである型です。あるタイプのポインタを隠すことは避けてください - 選択された状況でのみ有効です – chux