Java 和 C++ 中的多维数组有什么区别
what is difference between multidimensional array in java and c++?
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 中的数组是一个对象吗?
在Java中,多维数组是包含数组的数组(多维数组变量不一定包含多维数组,即它可以为空)。 在C++中,多维数组变量本身就是一个即时创建的巨大数组,其多维性质只是语法糖。 在C++中,您必须初始化数组的第一个索引之外的所有索引,以便告诉编译器如何在多维数组语法和它在幕后实际使用的单个巨型数组之间进行转换。
通过将多维数组初始化为指向数组指针数组的指针,而不是简单地初始化为数组数组(Java 中的对象大多等同于指向 C++ 中的对象的指针),您可以在 C++ 中获得更多类似 Java 的行为。 当然,然后你将不得不担心内存管理,而Java为你做了。
有一个简单的模板,可以用来让编译器给你一个数组的大小:
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]
.
相关文章:
- 通过JNI传递数据数组的最快方法是什么
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 当该数组的索引中没有元素时,指针指向什么?
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 从字符数组的元素中减去'a'是什么意思
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 字符数组前面的加号是什么意思?
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 在C++中,建议通过数组循环的方式是什么?
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- C++数组中的初始值设定项是什么?
- 如果我在字符数组上使用 close() 会发生什么?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- 使用STL对用户输入数组进行排序的错误有什么解决方案吗?
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 将 std::unique_ptr 重置为指向数组的指针有什么问题?