我知道如果我添加陣列 st 和 st2 以在記憶體中為其分配空間,然后將其添加到指標陣列中,則應該沒有問題:
/* works */
int st[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int st2[]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
int *day_tab[]= {
st,
st2
};
但是如果沒有先給它在記憶體中的空間,為什么字串特別有效?下面的代碼給出了一個錯誤:
int *day_tab[]= {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
下面的代碼也是如此:
char *day_tab[]= {
{'0','1','\0'},
{'0','1','\0'}
};
但下面的代碼有效
char *day_tab[]= {
"01",
"01"
};
uj5u.com熱心網友回復:
這個
int st[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int st2[]= {0,31,29,31,30,31,30,31,31,30,31,30,31};
int *day_tab[]= {
st,
st2
};
是三個陣列:兩個整數(具有自己的存盤空間)和一個包含兩個元素的陣列,它們是指向前兩個陣列的指標。
但是,這是無效的:
int *day_tab[]= {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
和之前一樣,您已經宣告了一個指向整數的指標陣列,但是指向什么的指標呢?那些花括號串列不是存盤位置,它們不能被指向。
你的最后一個例子基本上是有效但危險的:
char *day_tab[]= {
"01",
"01"
};
它是一個由兩個指向字符的指標組成的陣列,這些指標是用字串文字初始化的。字串文字非常特殊,因為它們實際上存盤在某個地方,通常在只讀記憶體中,并且可以共享(因此使用兩次的“01”字串只能存盤一次)。花括號串列在 C 中沒有這個特性,它僅用于字串文字。
最終代碼危險的原因在于它char*不是const char*。出于向后兼容性的原因,接受非常量型別,但這不是一個好主意,因為不允許修改文字字串中的資料。因此,如果您實際使用這些指標寫入“01”字串存盤,那么您就為潛在的災難做好了準備。
uj5u.com熱心網友回復:
以下作品
int *day_tab[]= {
st,
st2
};
因為當您訪問一個陣列時,它會被轉換為指向第一個元素的指標(這條規則很少有例外)。因此,當您在初始化時使用st和st2陣列時,它們將轉換為指向相應陣列第一個元素的指標,并且在初始化后,指標day_tab[0]將指向陣列的第一個元素,st指標day_tab[1]將指向陣列的第一個元素st1。
在代碼片段中
int *day_tab[]= {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
和
char *day_tab[]= {
{'0','1','\0'},
{'0','1','\0'}
};
您正在嘗試day_tab使用多個初始化程式初始化陣列的指標。請注意,指標是標量型別并且來自 C11 Standard#6.7.9p11
11 標量的初始值設定項應為單個運算式,可選擇括在大括號中....
但是,您可以使用復合文字來初始化day_tab int指標陣列的指標,如下所示:
int *day_tab[]= {
(int []){0,31,28,31,30,31,30,31,31,30,31,30,31},
(int []){0,31,29,31,30,31,30,31,31,30,31,30,31}
};
這將初始化指標day_tab[0]并day_tab[1]指向相應陣列的第一個元素。同樣,對于char指標陣列,您可以執行
char *day_tab[]= {
(char []){'0','1','\0'},
(char []){'0','1','\0'}
};
當你做
char *day_tab[]= {
"01",
"01"
};
它起作用是因為字串文字是字符陣列,當它在運算式中使用時,它將轉換為指標以char指向指向陣列第一個元素的型別。因此,這將初始化指標day_tab[0]并day_tab[1]指向只讀字串文字的第一個元素"01"。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/321560.html
上一篇:NodeJsArray.join在陣列的每個部分上帶有文本
下一篇:如何跳過陣列中的指定值?
