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

时间:2015-11-04 13:50:24

标签: c++ sizeof

在for循环中查找数组的大小时,我看到有人写

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

sizeof(arr) / sizeof(arr[0])数组的长度如何?它在技术上如何运作?

6 个答案:

答案 0 :(得分:30)

如果您有td,则array将返回数组占用的字节数。由于每个元素占用的空间超过1个字节,因此必须将结果除以一个元素(sizeof(array))的大小。这为您提供了数组中的元素数量。

示例:

sizeof(array[0])

LIVE EXAMPLE

请注意,如果将数组传递给函数,由于数组衰减到指针并且std::uint32_t array[10]; auto sizeOfInt = sizeof(std::uint32_t); // 4 auto numOfBytes = sizeof(array); // 10*sizeOfInt = 40 auto sizeOfElement = sizeof(array[0]); // sizeOfInt = 4 auto numOfElements = sizeof(array) / sizeof(array[0]); // numOfBytes / sizeOfElement = 40 / 4 = 10 返回指针的大小,上述操作将无效。

sizeof(array)

LIVE EXAMPLE #2

答案 1 :(得分:6)

如C ++标准(5.3.3 Sizeof)中所述

  

1 sizeof运算符产生对象中的字节数   表示其操作数。操作数是表达式,   这是一个未评估的操作数(第5条),或带括号的   型-ID。

在此表达式中

sizeof(arr) / sizeof(arr[0])

使用了两个带有sizeof运算符的子表达式。

此子表达式

sizeof(arr)

产生数组arr占用的字节数(我假设arr是一个数组)。

例如,如果您声明了一个类似

的数组
int arr[10];

然后编译器必须保留用于容纳10个int类型元素的内存。例如,如果sizeof( int )等于4,则编译器将保留10 * 4 = 40字节的内存。

子表达式

sizeof(arr[0])

给出数组中一个元素占用的字节数。您可以使用任何索引,例如

sizeof(arr[1000])

因为表达式未被评估。重要的是操作符内使用的对象(数组的元素)的字节大小。

因此,如果您知道为数组保留的总字节数

sizeof(arr)

并知道数组中每个元素占用的字节数(数组的所有元素具有相同的大小)然后您可以使用公式计算数组中的元素数

sizeof(arr) / sizeof(arr[0])

这是一个简单的关系。如果您有一个包含T

类型的N个元素的数组
T arr[N];

并且您知道数组占用的内存大小然后您可以使用公式计算其元素的大小

sizeof( arr ) / N == size of an element of the array. 

反之亦然

如果您知道数组占用的内存大小及其元素的大小,则可以计算数组中元素的数量

sizeof( arr ) / sizeof( a[0] ) == N - number of elements in the array

您可以按以下方式重写最后一个表达式

sizeof( arr ) / sizeof( T ) == N - number of elements in the array

因为数组的元素具有类型T,并且数组的每个元素都恰好占用了分配类型为T的对象所需的字节数。

考虑到通常初学者会犯这样的错误。它们将数组作为参数传递给函数。例如,假设您有一个函数

void f( int a[] )
{
   // ...
}

然后传递给你的数组函数

int arr[10];
f(arr);

然后该函数使用指向数组第一个元素的指针。实际上该函数有声明

void f( int *a )
{
   // ...
}

因此,如果您在函数

中编写代码
void f( int *a )
{
   size_t n = sizeof( a ) / sizeof( a[0] );
   // ...
}

然后函数中的a是一个指针(它不是一个数组),那么你会得到像

这样的东西
void f( int *a )
{
   size_t n = sizeof( int * ) / sizeof( int );
   // ...
}

通常指针的大小等于8或4个字节,具体取决于使用的环境。你不会得到元素的数量。你会得到一些奇怪的价值。

答案 2 :(得分:4)

只有当arr没有被衰减成指针时才有效,也就是说,它是一个数组类型,不是指针类型。

sizeof(arr)是数组占用的总大小。

sizeof(arr[0])是数组中第一个元素的大小。 (请注意,C ++中不允许使用零长度数组,因此如果数组本身存在,则此元素始终存在。)

由于所有元素的大小相同,因此元素的数量为sizeof(arr) / sizeof(arr[0])

答案 3 :(得分:3)

int-等于4个字节
sizeof(int)表示:1 * 4 = 4

int arr[10]-持有10 int
sizeof(arr)的意思是:10 * 4 = 40,我们得到10个int,每个int得到4个字节,arr没有[]意味着所有arr

sizeof(arr[0])表示:1 * 4 = 4

sizeof(arr) / sizeof(arr[0]) = 10 * 4/1 * 4 = 10,它是数组的长度。

答案 4 :(得分:1)

处理数组时(some_type name[some_size]sizeof(name)是数组占用的字节数。将数组的总大小除以一个元素(sizeof(name[0]))的大小,可以得到数组中有多少元素。

答案 5 :(得分:0)

c ++使用extent的方法,它允许你在数组的第N维中获得许多元素。 有关详细信息,请参阅http://en.cppreference.com/w/cpp/types/extent

int values[] = { 1 };

std::extent<decltype(values)>::value == 1