C++中数组的元素计数

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)

  • Nawaz 在这里是正确的,新程序员有时会错误地这样做,因为他们不明白虽然 f() 中的 arr 可以*用作*作为数组,但函数 f() 只知道 arr 是一个指针(因此 sizeof(arr ) == sizeof(样本 *))。这是对正确使用时有效且有用的构造的不当使用。 (2认同)
  • @Albus:通常,如果您的函数在某个范围内工作,那么您可以将其设计为使用迭代器(或您最喜欢的通用范围方法),而不是特定的容器. (2认同)

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)


Ebo*_*ike 9

C++中的数组与Java中的数组完全不同,因为它们完全不受管理.编译器或运行时不知道数组的大小.

只有在声明中定义了大小时,才会在编译时知道该信息:

char array[256];
Run Code Online (Sandbox Code Playgroud)

在这种情况下,sizeof(数组)为您提供合适的大小.

但是,如果将指针用作数组,则"数组"将只是一个指针,而sizeof将不会提供有关数组实际大小的任何信息.

STL提供了许多模板,允许您拥有数组,其中一些具有大小信息,其中一些具有可变大小,并且大多数具有良好的访问器和边界检查.

  • @GolezTrol:你不必记住任何东西,你使用智能指针. (6认同)

GMa*_*ckG 7

在给定数组的情况下,没有任何情况下,通过数组和数据的定义,arrsizeof(arr) / sizeof(arr[0])不是元素的数量sizeof.

事实上,它甚至直接提到(§5.3.3/ 2):

....当应用于数组时,结果是数组中的总字节数.这意味着n个元素的数组大小是元素大小的n倍.

强调我的.除以元素的大小sizeof(arr[0]),得到n.

  • 回到它后,我也不明白.谢谢回复. (2认同)