Alb*_*ore 21 c++ arrays sizeof
假设我有一个数组arr.当将以下不给数组的元素个数:sizeof(arr) / sizeof(arr[0])?
我只能说一种情况:数组包含的元素具有不同类型的派生类型.
我是对的并且在那里(我几乎肯定是必须的)其他这样的情况?
很抱歉这是一个微不足道的问题,我是一名Java开发人员,而且我对C++很陌生.
谢谢!
Naw*_*waz 32
假设我有一个数组arr.以下什么时候不会给出数组元素的数量:sizeof(arr)/ sizeof(arr [0])?
有一件事我经常看到新程序员这样做:
void f(Sample *arr)
{
int count = sizeof(arr)/sizeof(arr[0]); //what would be count? 10?
}
Sample arr[10];
f(arr);
Run Code Online (Sandbox Code Playgroud)
所以新程序员认为价值count将是10.但这是错误的.
即使这是错的:
void g(Sample arr[]) //even more deceptive form!
{
int count = sizeof(arr)/sizeof(arr[0]); //count would not be 10
}
Run Code Online (Sandbox Code Playgroud)
这一切都是因为一旦你将一个数组传递给这些函数中的任何一个,它就变成了指针类型,所以sizeof(arr)会给出指针的大小,而不是数组!
编辑:
以下是一种优雅的方法,您可以将数组传递给函数,而不会让它衰减为指针类型:
template<size_t N>
void h(Sample (&arr)[N])
{
size_t count = N; //N is 10, so would be count!
//you can even do this now:
//size_t count = sizeof(arr)/sizeof(arr[0]); it'll return 10!
}
Sample arr[10];
h(arr); //pass : same as before!
Run Code Online (Sandbox Code Playgroud)
Nik*_*kos 10
从 C++17 开始,您还可以使用标准化的 free 函数:
std::size(container)它将返回该容器中的元素数量。
例子:
std::vector<int> vec = { 1, 2, 3, 4, 8 };
std::cout << std::size(vec) << "\n\n"; // 5
int A[] = {40,10,20};
std::cout << std::size(A) << '\n'; // 3
Run Code Online (Sandbox Code Playgroud)
C++中的数组与Java中的数组完全不同,因为它们完全不受管理.编译器或运行时不知道数组的大小.
只有在声明中定义了大小时,才会在编译时知道该信息:
char array[256];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,sizeof(数组)为您提供合适的大小.
但是,如果将指针用作数组,则"数组"将只是一个指针,而sizeof将不会提供有关数组实际大小的任何信息.
STL提供了许多模板,允许您拥有数组,其中一些具有大小信息,其中一些具有可变大小,并且大多数具有良好的访问器和边界检查.
在给定数组的情况下,没有任何情况下,通过数组和数据的定义,arr值sizeof(arr) / sizeof(arr[0])不是元素的数量sizeof.
事实上,它甚至直接提到(§5.3.3/ 2):
....当应用于数组时,结果是数组中的总字节数.这意味着n个元素的数组大小是元素大小的n倍.
强调我的.除以元素的大小sizeof(arr[0]),得到n.