我遇到了這種奇怪的方式來定義在C中的結構,我無法找到任何地方這是真的嗎?typedef結構與*的名稱在c
typedef struct {
int val;
} *Name;
這是什麼區別?
typedef struct {
int val;
} Name;
但是我看到,我必須在第一個和「。」上使用「 - >」。第二,但真正的區別是什麼?
我遇到了這種奇怪的方式來定義在C中的結構,我無法找到任何地方這是真的嗎?typedef結構與*的名稱在c
typedef struct {
int val;
} *Name;
這是什麼區別?
typedef struct {
int val;
} Name;
但是我看到,我必須在第一個和「。」上使用「 - >」。第二,但真正的區別是什麼?
在第一種情況
typedef struct {
int val;
} *Name;
名稱Name
被聲明爲類型指針未命名的結構的別名。
您可以使用該指針類型,例如通過以下方式
Name ptr = malloc(sizeof(*ptr));
,然後你可以寫例如
ptr->val = 10;
或
(*ptr).val = 10;
也就是說在這個聲明中有被聲明爲Name類型的指針ptr
並動態創建一個對象o f結構和指針指向這個動態創建的對象。
在第二種情況下
typedef struct {
int val;
} Name;
名稱Name
被聲明作爲無名結構本身的別名。
要聲明這種類型的對象,你可以只寫
Name name;
然後
name.val = 10;
或只是
Name name = { 10 };
和結構類型的對象將被創建。
或者,如果你想分配結構類型的對象動態,你可以寫
Name *ptr = malloc(sizeof(Name));
爲了更清楚在這裏使用的typedef的另一個例子。
typedef int A[10];
此的typedef聲明名稱A
作爲陣列型int[10]
的別名。
是
A a;
此聲明聲明的類型A
即相當於int[10]
的數組對象a
後,你可以寫。
此聲明
typedef int (*A)[10];
聲明的名稱A
作爲別名的類型指針int[10]
類型的陣列。
這個聲明可以用於例如以下方式
int a[10];
A ptr_a = &a;
當你寫
typedef struct {
int val;
} Name;
你說「這個名字Name
現指struct
一個元素,一個int
名爲val
「。
當你寫
typedef struct {
int val;
} *Name;
明星改變了意義,使這個說「這個名字Name
現指指針爲struct
一個成員,一個名爲int
val
。」這就是爲什麼你需要使用箭頭運算符而不是一個點:在第一種情況下,Name
是一種誠實善良的結構,而第二種Name
是一種指向結構的指針。
@usr,那不是同一個主題的人。 –
那不是我的問題嗎? – Lurr
首先'Name'是一個指針結構的類型。避免在類型中隱藏指針 - 僅在特定情況下才是好的 – chux