我用陣列,其中一個例子被給出爲以下時閱讀本鏈路How do I use arrays in C++?,部分5常見的問題:常見的問題:信任類型不安全連接
// [numbers.cpp]
int numbers[42] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// [main.cpp]
extern int* numbers;
int main()
{}
由於「數字」 numbers.cpp是數組的名稱,它通常可以衰減到一個指針等於'&數字[0]',我期望在main.cpp值'數字'仍然是'&數字[0]'。但不是!而是'數字[0]',即'1'。
或比方說,我是編譯器,在「numbers.cpp」,我看到的符號「數字」作爲地址指向「1」,這是爲什麼同樣的符號變更爲值1' 'main.cpp中'?
我明白這就是作者所說的「類型不安全鏈接」。但我不知道爲什麼編譯器 這樣做,即使編譯器只是提出一個類型不匹配的鏈接錯誤對我更有意義。
有人可以幫忙解釋一下嗎?
感謝,
評論:
我想我的理解是,編譯見下文等同,使連接成功,否則將有 '無法解析的外部' 錯誤:
// [numbers.cpp]
int tmp[42] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; //{1,..9} starts at global address 0x1234
int *numbers = &tmp[0]; //numbers == 0x1234
// [main.cpp]
extern int* numbers; //numbers == 0x1234
int main()
{}
的真實情況
// [numbers.cpp]
int numbers[42] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; //{1,..9} starts at global address 0x1234
// [main.cpp]
extern int* numbers; //numbers == numbers[0] == 1
int main()
{}
因爲'int numbers [42]'不是一個指針。 – 2013-02-22 03:51:31
@Seth Carnegie。是的,但似乎編譯器確實從int數組轉換爲int指針。否則,鏈接器將引發「無法解析的外部」錯誤。我絕不能理解爲什麼它給main.cpp中的'數字'賦值'1'。 – user1559625 2013-02-22 04:05:16
@ user1559625,數字[42]將降級爲指針,因此*數字指向值爲1的整數。 – 2013-02-22 04:06:50