4
char a[][4] = {{'a','a','a'},
               {'a','a','a'},
               {'a','a','a'},
               {'a','a','a'}};

在 c++ 中,您必须初始化数组的最后一个索引。

在java中,如果你这样做会导致错误。

有人可以解释一下为什么吗??

另外,当我在 java 中检查这样的数组长度时。

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

结果是数组中列的长度

让我们说数组末尾有一个'\ 0',当我像这样检查c ++中数组的长度时。

cout << strlen(a[0]) 

我得到了整个数组的长度。

我可以像在java中一样在c ++中获取数组中行或列的长度吗?

这是因为java中的数组是一个对象吗?

4

2 回答 2

10

在Java 中,多维数组是包含数组的数组(并且多维数组变量不一定包含多维数组,即它可以为空)。在 C++ 中,多维数组变量本身就是一个巨大的数组,可以立即创建,其多维性质只是语法糖。在 C++ 中,您必须初始化数组的第一个索引以外的所有索引,以便告诉编译器如何在多维数组语法和它在幕后实际使用的单个巨大数组之间进行转换。

通过将多维数组初始化为指向数组指针数组的指针,而不是简单地作为数组数组,您可以在 C++ 中获得更多类似 Java 的行为(Java 中的对象主要等同于 C++ 中的对象指针)。当然,那么您将不得不担心 Java 为您做的内存管理。

于 2012-05-14T22:44:59.327 回答
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].

于 2012-05-14T23:16:09.310 回答