📜  如何在不使用sizeof的情况下在C C++中查找数组的大小?(1)

📅  最后修改于: 2023-12-03 15:38:38.357000             🧑  作者: Mango

如何在不使用sizeof的情况下在C/C++中查找数组的大小?

在C/C++中查找数组的大小是一项非常基本的任务,然而在某些情况下,我们可能需要不使用sizeof来计算数组的大小,比如在某些嵌入式系统中,sizeof可能是一个较为昂贵的操作,需要避免使用。在本文中,将介绍几种在不使用sizeof的情况下查找数组大小的方法。

方法一:计算元素数量的方式

我们可以通过数组的元素数量和每个元素的大小来计算数组的总大小。这种方法的代码如下:

int arr[] = {1, 2, 3, 4, 5};
int elemSize = sizeof(*arr); // 获取每个元素的大小
int elemCount = sizeof(arr) / elemSize; // 通过总大小除以每个元素大小得到元素数量
int arrSize = elemCount * elemSize; // 计算数组大小

printf("Array has %d elements, each element takes %d bytes, total size is %d bytes\n", elemCount, elemSize, arrSize);

输出如下:

Array has 5 elements, each element takes 4 bytes, total size is 20 bytes
方法二:计算地址差值的方式

我们可以将数组的首地址和尾地址相减来计算数组的大小。这种方法的代码如下:

int arr[] = {1, 2, 3, 4, 5};
int* arrBegin = arr; // 获取数组的首地址
int* arrEnd = arr + (sizeof(arr) / sizeof(*arr)); // 获取数组的尾地址
int arrSize = (char*)arrEnd - (char*)arrBegin; // 计算地址差值

printf("Array takes up %d bytes of memory\n", arrSize);

输出如下:

Array takes up 20 bytes of memory
方法三:使用预处理器的方式

我们可以使用预处理器来定义一个宏,来计算数组的元素数量。这种方法的代码如下:

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(*arr))

int arr[] = {1, 2, 3, 4, 5};
int arrSize = ARRAY_SIZE(arr) * sizeof(*arr); // 计算数组大小

printf("Array has %d elements, each element takes %d bytes, total size is %d bytes\n", ARRAY_SIZE(arr), sizeof(*arr), arrSize);

输出如下:

Array has 5 elements, each element takes 4 bytes, total size is 20 bytes
结论

以上是几种不使用sizeof的情况下,在C/C++中查找数组大小的方法。当然,在大多数情况下,使用sizeof是最简单、最常用的方法。但有时候,需要寻找其他方法,这些方法可以帮助我们为特定的需求优化代码。