2017-09-22 142 views
0

我遇到了這種奇怪的方式來定義在C中的結構,我無法找到任何地方這是真的嗎?typedef結構與*的名稱在c

typedef struct { 
     int val; 
    } *Name; 

這是什麼區別?

typedef struct { 
    int val; 
} Name; 

但是我看到,我必須在第一個和「。」上使用「 - >」。第二,但真正的區別是什麼?

+0

@usr,那不是同一個主題的人。 –

+0

那不是我的問題嗎? – Lurr

+1

首先'Name'是一個指針結構的類型。避免在類型中隱藏指針 - 僅在特定情況下才是好的 – chux

回答

4

在第一種情況

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; 
+0

使用「*」時,我必須使用malloc來實例化它,但沒有我可以簡單地說名字的名字; name.val = 3?這是爲什麼?謝謝你 – Lurr

+0

@Lurr看到我更新的位置。 –

+0

謝謝,另一個問題,如果你不介意,sizeof的參數是* ptr,它是否重要,或者它比給予sizeof * Name更可取? – Lurr

4

當你寫

typedef struct { 
    int val; 
} Name; 

你說「這個名字Name現指struct一個元素,一個int名爲val「。

當你寫

typedef struct { 
    int val; 
} *Name; 

明星改變了意義,使這個說「這個名字Name現指指針struct一個成員,一個名爲intval。」這就是爲什麼你需要使用箭頭運算符而不是一個點:在第一種情況下,Name是一種誠實善良的結構,而第二種Name是一種指向結構的指針。