当测试这样的数组时:
float test [3] = {1, 2, 3};
cout << "Test size: " << sizeof(test) << endl;
打印语句显示的大小为12
。类似地,当我将大小设为12
时,数组中的元素数量为47
。这不是以C++为单位指定数组大小的正确方法吗?
sizeof
不返回数组中的元素数,它返回以字节为单位的内存大小。由于数组包含三个常规整数,而整数的大小为 4 个字节,因此为 3 * 4 == 12 个字节。
要获取数组的长度,您有几个选项:
<小时 />选项 1
int size = sizeof(test) / sizeof(test[0]);
这样做是获取数组的大小(12 字节(,然后将其除以单个元素的大小(4 字节(。显然 12/4 == 3。
<小时 />选项 2
正如@PaulMcKenzie所指出的,如果你能够使用C++17,你就可以使用std::size。这使得它变得非常容易,因为您可以这样做:
int size = std::size(test);
<小时 />选项 3(不推荐(
int size = *(&test + 1) - test;
这是一个使用指针的聪明黑客,在这里解释。将导致未定义的行为,并可能中断,具体取决于编译器及其优化。
如果你想要更有效的方法来计算数组中的元素数量,你可以使用模板。
template<typename T, std::size_t Size>
std::size_t GetArrLength(T(&)[Size]) { return Size; }
如果我们这样称呼它:
float test[3] = {1,2,3};
GetArrLength(test);
编译器将尝试推断模板参数。要使参数类型与要传递的内容匹配,T 必须为浮点数,大小必须为 3(使参数成为对 3 个浮点数数组的引用(。
您必须使用以下方法来获取所需的数组的实际大小。
int size = sizeof(test)/sizeof(test[0]);
sizeof()
实际上返回 no. 字节数。所以,你得到不。数组对象中的字节数。为了得到真正的否。元素,我们需要将其除以那里元素的大小。例如,这里sizeof(float)
您需要将单个元素大小除以得到数组大小。
int sz = sizeof(test) / sizeof(test[0]);
cout << "test size: " << sz << endl;
这将起作用:
size_t n = sizeof(test)/sizeof(test[0]);
size
_t 是保证保存任何数组索引的类型,因此请使用size_t
。
标准库具有用于此目的的类型特征。
#include <type_traits>
#include <iostream>
int main()
{
float test [3] = {1, 2, 3};
std::cout
<< std::extent<decltype(test)>::value
<< 'n';
}