2011-07-20 38 views
2

我有一個名爲names的變量,它是一個二維數組。 我在下面聲明它,以便最多有5個名字,每個名字將由256個字符組成。在C++中的二維數組中存在傳遞引用的問題

int main(){ 
    char names[5][256]; 
    strcpy(names[0],"John"); 
    strcpy(names[1],"Matt"); 
    printf("%d\n",sizeof(names)/256);  //this prints out 5 which is correct 
    passit(names);    
} 

void passit(char names[][256]){ 
    printf("%d\n",sizeof(names)/256);  //this prints out 8 which seems to be a size of pointer 
} 

我應該如何改變這種做法,在passit功能,要素的數量將打印正確?

+0

C或C++?選一個。 –

+0

它是用於C++ .. – user482594

+0

你在哪裏通過引用? –

回答

7

你的代碼是C風格的。如果你真的寫C++話,我建議使用std::coutstd::vectorstd::string

void passit(std::vector<std::string> const& names) { 
    std::cout << names.size(); 
} 

int main() { 
    std::vector<std::string> names(5); 
    names[0] = "John"; 
    names[1] = "Matt"; 

    std::cout << names.size(); 
    passit(names);    
} 

否則,您可以執行中間修正,以現有的代碼。

正如您發現的那樣,當您嘗試按值傳遞數組時,它實際上會衰減到一個指針(在這種情況下爲char(*)[256]),並且您將丟失有關第一維尺寸的所有信息。

通過引用傳遞數組避免了這一點,不同之處在於您現在必須指定包含所有數組維度的完整數組類型;模板參數的扣除然後使這個自動:

template <size_t N> 
void passit(char (&names)[N][256]) { 
    printf("%d\n", N); 
} 
+0

沒有其他辦法可以解決這個問題而不改變函數聲明嗎? – user482594

+2

@ user482594:否。當您嘗試按值傳遞數組時,它實際上會衰減到一個指針(在這種情況下爲'char(*)[256]'),並且會丟失關於第一維尺寸的所有信息。按引用傳遞可以避免這種情況,除非你必須指定完整的數組類型;模板參數演繹使得這個自動化。 –