关于sizeof(arr)/sizeof(arr[0])解读(plus细节讲解增加)

本文详细介绍了C++中sizeof运算符的用法,特别是如何利用sizeof来计算数组中元素的数量。通过实例展示了不同类型的数组(char、int、long、long long)在32位环境下的字节数。强调了sizeof计算的是变量的大小,而非字符串长度,并提醒在使用memset初始化数组时的注意事项。最后,通过一个具体的示例解释了sizeof(arr)/sizeof(arr[0])用于获取数组元素个数的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家肯定经常看到

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

这串代码

并且知道这是求一个数组内含多少个成员

我们先来看看sizeof(arr)的意思

sizeof(arr)是求arr这个数组有多少字节的

然鹅sizeof(arr[0])则是求下标为0的那个成员有多少字节

这里的sizoof所要求的字节跟你所定义的类型有关

我们通过一串代码来看每个类型的字节数

#include<iostream>
using namespace std;
int main()
{
	char arr1[10];
	int arr2[10];
	long arr3[10];
	long long arr4[10];
	cout << sizeof(arr1) << endl << sizeof(arr2) << endl << sizeof(arr3)<<endl<<sizeof(arr4);
	return 0;
}

结果

10
40
40
80

我们可以观察到

char 数组里面是一个1 个元素1 个字节(注:'\0'在sizeof()中是会被计算的,所以我们求char[]字符串的长度一般可以用strlen(),而不采用sizeof()。{sizeof()计算的是变量的大小,而strlen计算的是字符串的长度,并且strlen()是以'\0'作为计算字符长度的结尾}

int 和 long 数组里面在32位环境中都是1 个元素 4 个字节

long long 数组里面是1 个元素 8个字节

我们都知道  /  是除以然后取整的意思

我们就可以通过总字节

除以数组中的任意的一个元素的字节

来达到求一个数组中有多少元素的目的

#include<stdio.h>
int main()
{
	int arr[] = { 1,2,3,6,4,8,9,1,3};
	int i = 0;
	i = sizeof(arr) / sizeof(arr[0]);//数组总字节(36)除以单个成员的字节(4)
	printf("%d", i);//i=9
	return 0;
}

那么 sizeof(arr)/sizeof(arr[0]) 就可得为求出数组成员的个数


附加小知识:

我们在使用memset对数组初始化的时候

要知道memset函数是按照字节对内存块进行初始化

所以不要写错了哦

错误写法:

memset(arr,0,sizeof(arr)/sizeof(arr[0]));

 正确写法:

memset(arr,0,sizeof(arr));//将数组全部初始化为0

PS:进行了内容细节增加,帮助大家更好的理解如何用sizeof来求数组中的元素

### C语言中 `sizeof arr / sizeof arr[0]` 的含义解释 在C语言中,表达式 `sizeof arr / sizeof arr[0]` 是一种常用的技巧,用来计算数组的元素个数。以下是对其含义的具体分析: 1. **`sizeof arr` 表达式的含义** - `sizeof arr` 返回整个数组占用的内存大小(单位为字节)。对于一个固定大小的数组来说,它等于数组中的元素个数乘以单个元素的大小[^1]。 - 例如,在代码片段中: ```c int arr[10]; printf("sizeof(arr) = %zu\n", sizeof(arr)); ``` 假设 `int` 类型占据 4 字节,则 `sizeof(arr)` 的结果将是 `40`(即 `10 * 4`)。 2. **`sizeof arr[0]` 表达式的含义** - `sizeof arr[0]` 返回数组第一个元素所占的内存大小。这实际上就是数组中每个元素的数据类型的大小。 - 继续以上面的例子来看: ```c printf("sizeof(arr[0]) = %zu\n", sizeof(arr[0])); ``` 如果 `arr` 是一个 `int` 数组,那么 `sizeof(arr[0])` 的结果是 `4`(假设 `int` 占用 4 字节)。 3. **整体表达式的逻辑意义** - 将 `sizeof arr` 和 `sizeof arr[0]` 结合起来使用时,其目的是通过除法运算得出数组中元素的数量。 - 公式推导如下: \[ \text{元素个数} = \frac{\text{数组总大小}}{\text{单个元素大小}} \] - 在实际应用中表现为: ```c int count = sizeof(arr) / sizeof(arr[0]); ``` 4. **适用范围与局限性** - 此方法仅适用于局部定义的数组变量,因为此时编译器能够知道数组的实际大小[^3]。 - 然而,当数组作为参数传递给函数时,会发生所谓的“数组退化”,即数组名变为指向首元素的指针。在这种情况下,`sizeof(arr)` 不再表示数组的整体大小,而是仅仅代表指针本身的大小(通常为 4 或 8 字节),从而导致计算结果错误[^4]。 --- ### 示例代码验证 为了更直观地展示这一概念,考虑以下示例代码及其运行结果: ```c #include <stdio.h> void testFunction(int arr[]) { printf("In function: sizeof(arr) = %zu, sizeof(arr[0]) = %zu\n", sizeof(arr), sizeof(arr[0])); // 注意这里的输出可能不符合预期 } int main() { int arr[10]; printf("In main: sizeof(arr) = %zu, sizeof(arr[0]) = %zu\n", sizeof(arr), sizeof(arr[0])); testFunction(arr); return 0; } ``` #### 输出结果分析 - 在 `main()` 中,`sizeof(arr)` 反映的是数组的真实大小(如前所述,可能是 `40` 字节),因此可以通过 `sizeof arr / sizeof arr[0]` 得到正确的元素数目。 - 在 `testFunction()` 内部,由于发生了数组退化现象,`sizeof(arr)` 实际上只给出了指针的大小(比如 `8` 字节),所以无法利用相同方式获得有效信息。 --- ### 总结 综上所述,`sizeof arr / sizeof arr[0]` 是一种简洁有效的手段来确定静态分配数组的长度,前提是必须直接作用于原始声明的数组对象之上。一旦离开当前上下文环境或者进入另一个函数域之后,就需要采取额外措施(像显式传递长度参数等)替代这种方法。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CTGU-Yoghurt

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值