2017-08-31 56 views
2

考慮:「typedef」類型名稱可以聲明一個指向結構的指針,比如「struct」定義嗎?

typedef Card* Cardptr; 

這是否意味着中foo以下聲明

Cardptr foo; 

是一樣的在這個聲明?:

struct Card{ 

} *foo; 

*符號的出現我感到困惑,因爲它在我們給出的聲明中出現在卡片旁邊,並出現在foo附近可以創建一個可變foo,當你已經示出在struct Card定義的尾端是一個Card*,它是等效於上面的Cardptr foo(假設的早期定義:與*foo

+0

不,不。 'typedef'爲一個已經存在的類型引入了一個別名。你無法用它來定義一個類。 – skypjack

+3

C和C++的答案是不同的 - 你在問什麼? –

+0

@JonathanLeffler:這很有趣 - 希望你能詳細說明實際的差異,而不是縮小問題的範圍。人們在頭文件中需要使用這種類型的代碼來包含這兩種語言並不罕見,所以用兩種語言標記問題本身並不是不合理的。 –

回答

0

[用於C++]是聲明Card),如:

struct Card { 

}; 
typedef Card* Cardptr; 
Cardptr foo; 

人們有時會做後*foo事情簡潔 - 它避免了重複的類型。

+0

你可能想要添加,你的答案只適用於C++。它不適用於C。 – alk

2

這是否意味着在以下聲明中的foo與此聲明中的foo相同? ...

是的,沒有。我說是,因爲這兩個聲明都聲明瞭一個名爲Card的類型的指針變量(在C++中,C也適用,它必須是struct Card)。但它不完全相同。

第一個聲明可以引入所謂的「不透明句柄」。該結構不需要在該點完全定義。您可以將指針傳遞給它,但只有在看到完整定義之後才能訪問任何成員。

第二個聲明引入了完整類型並立即創建一個指向它的指針。這與完整結構定義出現後的第一種情況相同。

*符號的外觀有我困惑,因爲它鄰近似乎Card在我們所作的發言,並foo出現在相鄰的語句*foo

*鄰接關係無關緊要的。由於無論您在哪裏撰寫,它的應用都是相同的。它修改新申報的實體,而不是類型。爲了說明:

int *i, j; 

將創建只有一個指針,命名爲i,並命名爲j一個普通整數。由於typedef語句遵循與變量聲明相同的規則(關鍵字typedef的應用程序只是改變了從引入新對象到引入新類型名稱的含義),因此*的行爲是等效的。這意味着在這裏:

typedef int *i, j; 

*再次只i修改。我們結束了兩個別名。別名i,它是指向int的指針的新類型名稱,以及j,它是int的別名。

事實上,如下得到同樣的效果我們可以重寫它:

typedef int j, *i; 

同樣,因爲*只修改i

+0

我的書說'typedef Card * Cardptr;'「將新類型名稱'Cardptr'定義爲'Card *'類型的同義詞。根據你的說法,我發現'*'符號修改了'Cardptr',並且其他同義詞(如果還有更多的話)不會被'*'符號修改。這讓我感到困惑。我的書看起來好像實際的結構類型是'Card *',這使我認爲其他同義詞將具有類型'Card *',如'typedef Card * Cardptr,n;',其中'n'也具有輸入'Card *'。如果他們移動像這樣的'''符號,它會不會更清楚'typedef Card * Cardptr,n;'? –

+2

@MarcusKim - 它會更清晰。事實上,你的困惑和預防是這種編碼風格(我個人遵循)的一個主要論據,它把星號放在標識符旁邊。另一種說法是,修改總是以實體的類型爲準。拋開編碼風格,只記得修改了新標識符的類型(使變量'i'成爲'int * i,j;中的一個指針','typedef Card *中的另一個指針類型的名稱'CardPtr' CardPtr,n;')。 – StoryTeller

相關問題