C语言:sizeof和strlen计算有关数组字节大小

大家清楚 sizeof 和 strlen 的区别吗?
sizeof是运算符,确定的是字符所占空间大小,参数可以有数组、指针、类型、对象、函数等。

strlen是C语言的标准库函数,确定是字符串的大小,目的是找到\0,\0之前出现多少个字符,字符串长度就是几,如果找不到可能就是随机值。

数组名是首元素地址,除了以下两个条件外,其他都是首元素地址
1.sizeof(数组名)----数组名表示整个数组
2.&数组名----数组名表示整个数组

下面有三组数组例题:
大家可以自行验证,每一行后面都有我写的答案和解析
1、数组里放存放整型数字

int a[]={1,2,3,4};
printf("%d\n",sizeof(a));//16  sizeof(数组名)-计算的是整个数组总大小,也就是4*4=16
printf("%d\n",sizeof(a+0));//4/8 a表示首元素地址,a+0还是表示首元素地址,没有变化
printf("%d\n",sizeof(*a));//4   数组名表示首元素地址,*a表示解引用首元素,也就是首元素的大小,占4个字节
printf("%d\n",sizeof(a+1));//4/8 数组名表示首元素的地址,a+1表示第二个元素的地址,地址大小4/8字节
printf("%d\n",sizeof(a[1]));//4   a[1]表示第二个元素,所以sizeof(a[1])也就是第二个元素大小4字节
printf("%d\n",sizeof(&a));//4/8 &a表示取数组地址,数组地址那也是地址,也是4/8字节
printf("%d\n",sizeof(*&a));//16  &a表示取数组地址,*&a表示解引用取数组地址,则*和&可看成相互抵消,最后剩个a,等于sizeof(a),也就是数组总大小16字节
printf("%d\n",sizeof(&a+1));//4/8 &a表示取数组地址,&a+1表示跳过一整个数组的地址,也就是下一个数组地址,但也还是地址,所以是4/8字节
printf("%d\n",sizeof(&a[0]));//4/8 &a[0]表示取第一个元素地址,是地址就是4/8字节
printf("%d\n",sizeof(&a[0]+1));//4/8 &a[0]+1表示取第二个元素地址,是地址就是4/8字节

2、数组里存放字符
sizeof用法计算

char arr[]={'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr));//6         sizeof计算的是整个数组大小,6*1=6个字节
printf("%d\n",sizeof(arr+0));//4/8     arr是首元素的地址,arr+0没有变化,还是首元素的地址,地址的大小是4/8个字节
printf("%d\n",sizeof(*arr));//1        arr是首元素地址,*arr解引用就是首元素,首元素大小是1个字节
printf("%d\n",sizeof(arr[1]));//1      arr[1]是第二个元素的大小,爷还是1个字节
printf("%d\n",sizeof(&arr));//4/8      &arr虽然是数组的地址,但是还是地址,也就还是4/8字节
printf("%d\n",sizeof(&arr+1));//4/8    &arr+1是跳过整个数组后的地址,地址大小还是4/8字节
printf("%d\n",sizeof(&arr[0]+1));//4/8 第二个元素的地址,只要是地址,那就是4/8字节

strlen用法计算

//strlen目的是找到\0,\0之前出现多少个字符,字符串长度就是几
printf("%d\n",strlen(arr));//随机值         因为arr数组中没有\0,所以不会停下来一直找下去,直到找到\0为止
printf("%d\n",strlen(arr+0));//随机值       arr+0还是表示首元素地址,从首元素地址找下去,arr数组中没有\0,所以还是会一直找下去
printf("%d\n",strlen(*arr));//程序出错    因为*arr表示解引用元素首地址,也就是首元素字符a,a代表97,也就是把97当作地址传过去,非法访问,程序会崩溃
printf("%d\n",strlen(arr[1]));//程序出错  arr[1]是第二个元素,也就是把字符b传过去,b代表98,非法访问,出错原因跟上一个一样
printf("%d\n",strlen(&arr));//随机值        &arr取首元素地址,结果跟第一、二个一样,找不到\0,随机值
printf("%d\n",strlen(&arr+1));//随机值-6    &arr+1表示从下一个数组开始起寻找\0,跳过了数组arr,也就是跳过了6个字节,所以比上一个小6
printf("%d\n",strlen(&arr[0]+1));//随机值-1 &arr[0]+1表示从第二个元素的地址开始寻起,所以比第一个strlen少1个字节,但也是随机值

二维数组sizeof用法

int a[3][4]={0};
printf("%d\n",sizeof(a));//48 计算的是数组总大小,也就是3*4*4=48
printf("%d\n",sizeof(a[0][0]));//4 a[0][0]是数组第一个元素,所以是4个字节
printf("%d\n",sizeof(a[0]));//16 此处a[0]相当于第一行作为一维数组的数组名,而因为a[0]是数组名单独放进sizeof()内的,所以计算的是第一行的大小
printf("%d\n",sizeof(a[0]+1));//4/8 a[0]是第一行数组名,而a[0]+1是数组第一行第二个元素地址,并不是指第二行地址,所以是4/8字节
printf("%d\n",sizeof(*(a[0]+1)));//4 a[0]+1是第一行第二个元素地址,解引用则是第一行第二个元素。所以是4个字节
printf("%d\n",sizeof(a+1));//4/8 a不是单独放在sizeof内,所以数组名表示第一行地址,a+1则表示第二行地址,是地址就是4/8
printf("%d\n",sizeof(*(a+1)));//16 解引用第二行地址,也就是计算第二行的大小,所以是16
printf("%d\n",sizeof(&a[0]+1));//4/8 &a[0]表示取第一行的地址,+1则表示取第二行的地址,是地址就是4/8
printf("%d\n",sizeof(*(&a[0]+1)));//16 解引用第二行地址,也就是第二行大小,所以是16
printf("%d\n",sizeof(*a));//16 a表示第一行,*a则是解引用第一行,所以计算的是第一行的大小,是16字节
printf("%d\n",sizeof(a[3]));//16 a[3]虽然看起来是第四行,可实际上sizeof不会访问超出的部分,只会访问跟sizeof(a[0])一样的类型,所以计算的还是一行的大小,是16

sizeof和strlen看似简单,可实际上,这些题得出答案的原因你是否都会吗

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

tyro达令

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

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

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

打赏作者

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

抵扣说明:

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

余额充值