2017-01-24 47 views
1

我有這樣的代碼:const char []變量之間的區別;和「一些字符」

const char menu23[] = "2.3. "; 
const char menu24[] = "2.4. "; 
const char menu25[] = "2.5. "; 
const char menu26[] = "2.6. "; 
const char menu27[] = "2.7. ";  
const char menu28[] = "2.8. "; 

MenuEntry menu[] = // MenuEntry is a struct 
{ 
    {menu23, MENU2_OPTIONS, 22, 24, 23, 0, 0, 0}, // 23 
    {menu24, MENU2_OPTIONS, 23, 25, 2, 0, 0, 0}, // 24 
    {menu25, MENU2_OPTIONS, 24, 26, 0, 0, 0, 0}, // 25 
    {menu26, MENU2_OPTIONS, 25, 27, 0, 0, 0, 0}, // 26 
    {menu27, MENU2_OPTIONS, 26, 28, 0, 0, 0, 0}, // 27 
    {menu28, MENU2_OPTIONS, 27, 29, 0, 0, 0, 0} // 28 
} 

我可以用這個代替它呢?

MenuEntry menu[] = // MenuEntry is a struct 
{ 
    {"2.3. ", MENU2_OPTIONS, 22, 24, 23, 0, 0, 0}, // 23 
    {"2.4. ", MENU2_OPTIONS, 23, 25, 2, 0, 0, 0}, // 24 
    {"2.5. ", MENU2_OPTIONS, 24, 26, 0, 0, 0, 0}, // 25 
    {"2.6. ", MENU2_OPTIONS, 25, 27, 0, 0, 0, 0}, // 26 
    {"2.7. ", MENU2_OPTIONS, 26, 28, 0, 0, 0, 0}, // 27 
    {"2.8. ", MENU2_OPTIONS, 27, 29, 0, 0, 0, 0} // 28 
} 

有什麼功能上的區別嗎?

+1

這將有助於顯示'MenuEntry'的定義 –

回答

0

沒有差異。然而,如果您稍後想要更改每個菜單的名稱(以及在多個位置使用常量名稱的情況下),則第一個可以更靈活。

+1

一般來說有差異;如果有問題的結構有第一個成員的數組,那麼第二個版本可以工作,但第一個不會。 (由於第一個版本適用於OP,因此我們可以推斷該結構具有const char *成員) –

+0

@ M.M錯誤。如果'MenuEntry'的第一個成員是char數組,則第二個版本也不能工作。因爲字符數組不能用字符串文字分配。我們必須使用'strcpy()'來做到這一點。否則會出現編譯錯誤。 –

+0

@MartinZhai字符串文字可以初始化一個字符數組,例如'char x [4] =「abc」;'。您將初始化與賦值 –

2

還有一個區別。

在此問題中,MenuItem的第一個成員必須是char *類型。 (否則,此問題中的第一版代碼將失敗並出現編譯錯誤。)

char menu23[] = "2.3. ";這是一個char數組。字符串存儲在數組的內存中。它的壽命與陣列相同。如果它在函數中定義,它將在函數返回後被銷燬。如果它被定義爲全局變量,那麼與第二版本沒有功能差異。 (但在實現方面仍然不同)

{"2.3. ", MENU2_OPTIONS, 22, 24, 23, 0, 0, 0},此行中的字符串是字面常量。它將被存儲在內存的靜態區域。它的使用壽命將與您的應用程序相同。

相關問題