2010-07-20 94 views
4

以下函數的輸出爲「int *」,表示形式參數轉換爲整型指針。這種設計有什麼必要的理由嗎?爲什麼我們不能保留數組類型?爲什麼函數的形式參數的數組類型轉換爲指針?

// the output is "int *" 
#include<typeinfo> 
void Func(int ar[5]) 
{ 
    printf("%s\n", typeid(ar).name(); 
} 
int main() 
{ 
    int ar[5]; 
    Func(ar); 
    return 0; 
} 
+0

也看到這個答案:http://stackoverflow.com/questions/3264611/arguments-in-a-function-prototype/3264641#3264641 – 2010-07-20 08:09:32

回答

7

是否有此設計的任何必要的理由嗎?

這是歷史的行李從C.據稱1這是方便,因爲你不能按值反正傳遞數組。

如果你想保留的類型,你可以使用一個引用或指針:

void Func(int (&ar)[5]); 

或者使用模板函數接受任意大小的數組:

template<std::size_t N> void Func(int (&ar)[N]); 
+0

@sbi:'template void func(T(&ar)[N])'更好。 :P – 2010-07-20 08:14:32

+0

&@Prasoon:當人們需要某些東西來處理不同的_types_時,人們經常會想到模板,但通常會忘記非模板參數。 – sbi 2010-07-20 08:37:10

2

我想補充說這被稱爲「陣列衰減」,這裏有一個很好的討論:

http://www.lysator.liu.se/c/c-faq/c-2.html

在C++中使用原始數組有點「C風格」。真正的C++熟練使用std :: vector,它沒有衰減和輸入問題。儘管如此,遺留代碼充滿了原始數組,「C++」編譯器必須在「C」規則下播放以提供兼容性。

相關問題