2012-05-14 23 views
3
char a[][4] = {{'a','a','a'}, 
       {'a','a','a'}, 
       {'a','a','a'}, 
       {'a','a','a'}}; 

在C++中,您必須初始化數組的最後一個索引。java和C++中的多維數組有什麼區別?

在java中,如果你這樣做會導致錯誤。

有人可以解釋我爲什麼?

此外,當我在java中檢查這樣的數組的長度。

System.out.println(a[0].length); 

結果是該列的陣列

允許在長度說,有一個「\ 0」在數組的末尾,當我檢查陣列的長度在C++這樣的。我得到整個數組的長度。

我可以在java中像C++一樣獲取數組中行或列的長度嗎?

這是在java中的數組是一個對象嗎?

+6

C++中的數組是對象。 'strlen'並不意味着檢索數組的長度。 –

+3

*「在C++中,您必須初始化數組的最後一個索引。」*什麼? – Pubby

+4

實際上,無論你想要問什麼,答案都是* Java不是C++ *。東西的工作方式不同。 –

回答

9

在Java中,多維數組是一個包含數組的數組(並且多維數組變量不一定包含多維數組,即它可以爲null)。在C++中,多維數組變量本身就是一個巨大的數組,它立即創建,其多維性質只是語法上的糖。在C++中,爲了告訴編譯器如何在多維數組語法和實際在幕後使用的單個巨大數組之間進行轉換,您必須初始化除數組第一個索引以外的所有數據。

您可以通過將多維數組初始化爲指向數組的指針而不是簡單地指定爲數組的數組來獲得更多類Java行爲(Java中的對象大多等同於指向對象的指針C++)。當然,那麼你不得不擔心內存管理,這是Java爲你做的。

+7

或者你可以停止領導一個asketic生活,並使用std :: vector或std :: array :) – ScarletAmaranth

+0

好點。這些還提供了一個size()函數,它和Java的.length一樣。 – Brilliand

+0

重要的是要注意,如果這個答案說*單個巨大的數組*它意味着*單個巨大的內存塊*。數組既是它們的內存和類型,而編譯器也會分配一個塊,它不會創建任何隱藏的*數組*(作爲類型) –

2

有一個簡單的模板,可以用來讓編譯器給你一個數組的大小:

template <typename T, size_t N> 
size_t array_size(T (&)[N]) { 
    return N; 
} 

該模板可以與整個陣列中使用,或與包含數組:

char a[][4] = {{'a','a','a'}, 
       {'a','a','a'}, 
       {'a','a','a'}, 
       {'a','a','a'}}; 
std::cout << array_size(a) << std::endl; // 4 
std::cout << array_size(a[0]) << std::endl; // 4 

如果你想知道爲什麼這兩個產生相同的結果,數組的大小先是行然後是列。在你的情況下,你正在用三個元素初始化4行(第四個元素將被初始化值,即歸零)。如果你打算有4行3列,你的定義應該是:char a[][3]