sizeof(arr) / sizeof(arr[0]) 是如何工作的?

13 浏览
0 Comments

sizeof(arr) / sizeof(arr[0]) 是如何工作的?

在for循环中查找数组的大小时,我看到过人们这样写:\n

int arr[10];
for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){}

\nsizeof(arr) / sizeof(arr[0])如何表示数组的长度?它在技术上是如何工作的?

0
0 Comments

sizeof(arr) / sizeof(arr[0])这个表达式的作用是计算一个数组的长度。数组arr中的每个元素占用4个字节,而整个数组arr占用40个字节。而arr[0]是数组arr的第一个元素,也是一个int类型的变量,占用4个字节。所以sizeof(arr) / sizeof(arr[0])实际上是40 / 4 = 10,即数组arr的长度为10。

这个问题的出现是因为在C/C++中,数组传递给函数时,数组的长度信息会丢失。函数只能接收到数组的首地址,无法知道数组的长度。而有时候我们需要知道数组的长度,比如在遍历数组或者进行其他操作时。所以就有了计算数组长度的需求。

解决这个问题的方法就是使用sizeof(arr) / sizeof(arr[0])这个表达式来计算数组的长度。它的原理就是通过计算整个数组占用的字节数除以数组中每个元素占用的字节数,从而得到数组的长度。这个方法简单直接,并且不依赖于具体的数组类型或大小,所以可以广泛应用于不同的情况。

总结起来,sizeof(arr) / sizeof(arr[0])是一种常用的计算数组长度的方法,它通过计算整个数组占用的字节数除以数组中每个元素占用的字节数,从而得到数组的长度。这个方法解决了在C/C++中无法直接获取数组长度的问题,可以方便地应用于不同的数组操作中。

0
0 Comments

sizeof(arr) / sizeof(arr[0])是一个常见的用于计算数组元素个数的表达式。它利用了C++中sizeof运算符的特性,通过计算数组总字节数除以单个元素的字节数来得到数组中元素的个数。

在这个表达式中,有两个子表达式使用了sizeof运算符。第一个子表达式sizeof(arr)返回了数组arr占用的字节数。例如,如果我们声明了一个int类型的数组arr[10],并且假设sizeof(int)等于4,那么编译器会为这个数组分配40个字节的内存空间。

第二个子表达式sizeof(arr[0])返回了数组中一个元素占用的字节数。这个表达式中可以使用任意索引,比如sizeof(arr[1000]),因为这个表达式只是用来获取数组元素的大小,而不会对数组进行实际的访问。

因此,如果我们知道了数组占用的总字节数sizeof(arr),以及每个元素的字节数sizeof(arr[0]),那么就可以通过计算sizeof(arr) / sizeof(arr[0])来得到数组中元素的个数。

总结一下,如果我们有一个包含N个元素的类型为T的数组arr[N],并且知道了数组占用的总字节数sizeof(arr),那么可以使用公式sizeof(arr) / N来计算每个元素的大小。相反地,如果我们知道了数组占用的总字节数sizeof(arr)和每个元素的大小sizeof(T),那么可以使用公式sizeof(arr) / sizeof(T)来计算数组中元素的个数。

需要注意的是,初学者经常会犯一个错误,就是将数组作为参数传递给函数。例如,假设我们有一个函数void f(int a[]),然后我们将数组arr作为参数传递给这个函数f(arr)。实际上,函数f中的参数a是一个指针,而不是一个数组。所以,如果我们在函数中使用sizeof(a) / sizeof(a[0])来计算数组元素的个数,实际上得到的是sizeof(int*) / sizeof(int),因为a是一个指针而不是一个数组。指针的大小通常是8或4个字节,具体取决于编译环境,这样得到的结果将是一个奇怪的值,而不是数组中元素的个数。

为了解决这个问题,我们可以使用其他方法来传递数组参数,比如使用指针或者使用C++中的模板。这样就可以正确地获取数组中元素的个数,而不会得到错误的结果。

0
0 Comments

在C++中,如果你有一个数组,那么`sizeof(array)`将返回数组占用的字节数。由于每个元素可能占用多个字节的空间,你必须将结果除以一个元素的大小(`sizeof(array[0])`)。这将给出数组中元素的数量。

然而,如果你将一个数组传递给一个函数,上述方法将不起作用,因为数组会退化为指针,而`sizeof(array)`将返回指针的大小。

如果我们写`array.length`,这意味着在所有情况下我们也能得到正确的答案吗?或者有任何例外吗?

对于C数组来说,不存在`array.length`。如果你指的是`std::array::size()`,那么是一样的。

你是对的,对于C语言来说,没有办法获取"array.length"。但是对于C#来说,有一个公共方法可以获取数组长度,如下所示:"public int Length { get; }"。这里有一些C#的好例子:[learn.microsoft.com/en-us/dotnet/api/system.array.length?view=netcore-3.1](https://learn.microsoft.com/en-us/dotnet/api/system.array.length?view=netcore-3.1)

顺便说一下,你写的是正确的:在C++11或更新的版本中,我们也可以简单地调用`array.size()`,这将返回数组的确切长度。对于旧版本的C++,我们仍然需要进行长时间的计算:"sizeof(arr) / sizeof(arr[0])"。我只是想在你的评论中添加一个关于"版本C++11或更新版本"的注释,以防有人需要知道。现在已经是2020年了,所以我假设大多数人都在使用较新的C++版本。

0