详解Sizeof与Strlen

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


提示:以下是本篇文章正文内容,下面案例可供参考

一、简单概念

sizeof

sizeof是操作符,属于单目操作符,不是函数;sizeof是用来计算对象或所创建的对象占用内存空间的大小(单位为字节)。

strlen

strlen 是C语言库函数,用来计算字符串的长度。(遇到\0则停止计算)

注:使用时须引入头文件#include<stdio.h>

二、数组使用

首先,在介绍sizeof 与strlen在数组使用上的区别前,简单介绍一下关于数组名的概念:

一般情况下,数组名表示数组首元素的地址;

有且仅有两个例外:

1.sizeof(数组名):此时数组名表示整个数组,用来计算整个数组的大小,单位为字节;

2.&数组名:此时数组名表示整个数组,取出的是整个数组的地址。

1.一维数组

int a[]={1,8,2,4}      
printf("%d\n",sizeof(a))//16      a作为数组名单独放在sizeof内部,计算的是数组的总大小
printf("%d\n",sizeof(a+0));//4/8  a并未作为数组名单独放在sizeof内部,a表示数组首元素的地址
//a+0还是数组首元素的地址,地址大小为4/8字节
printf("%d\n",sizeof(*a));//4     a表示数组首元素地址,*a为数组首元素,首元素大小为4字节
printf("%d\n",sizeof(a+1));//4/8  a表示数组首元素地址,a+1表示数组第二个元素的地址,是地址大小为4/8
printf("%d\n",sizeof(a[1]));//4   数组第二个元素,大小为4字节
printf("%d\n",sizeof(&a));//4/8   a表示整个数组,&a表示整个数组的地址,整个数组的地址也为地址
printf("%d\n",sizeof(*&a));//16   &a是数组的地址,为数组指针类型,解引用访问整个数组
printf("%d\n",sizeof(&a+1));//4/8 &a+1跳过整个数组,但本身还是地址
printf("%d\n",sizeof(&a[0]));//4/8 数组首元素地址
printf("%d\n",sizeof(&a[0]+1));//4/8 数组第二个元素的地址

int *p=a;//int*
int (*p)[4]=&a;//数组指针

2.字符数组

char arr[] = {'a','b','c','d','e','f'};

//sizeof

printf("%d\n", sizeof(arr));//6      arr是数组名,单独放进sizeof中,计算的是整个数组的大小
printf("%d\n", sizeof(arr+0));//4/8  arr是首元素地址,arr+0也是首元素地址
printf("%d\n", sizeof(*arr));// 1    arr为首元素地址,*arr为首元素
printf("%d\n", sizeof(arr[1]));//1   arr为首元素底子,arr[1]为数组第二个元素
printf("%d\n", sizeof(&arr));//4/8   arr表示整个数组,&arr为整个数组的地址
printf("%d\n", sizeof(&arr+1));//4/8 &arr为整个数组的地址,&arr+1跳过整个数组,指向'f'的后面,但本身还是地址
printf("%d\n", sizeof(&arr[0]+1));//4/8 arr为首元素的地址。&arr[0]为数组首元素的地址,+1跳过一个元素,为数组第二个元素的地址

//strlen

printf("%d\n", strlen(arr));//随机值   arr为数组首元素地址,strlen得到arr后,从arr数组首元素开始计算字符串的长度,遇到'\0'截止,但arr数组中没有'\0',arr内存的后面有无'\0'或者什么时候遇到'\0'都是不确定的,所以为随机值
printf("%d\n", strlen(arr+0));//随机值 arr 为数组首元素地址,arr+0依然为数组首元素地址
printf("%d\n", strlen(*arr));//err    *arr为数组首元素'a',ASCII码值为97,strlen会把97当成地址访问,造成非法访问内存
printf("%d\n", strlen(arr[1]));//err  arr[1]为数组第二个元素'b'
printf("%d\n", strlen(&arr));//随机值  arr表示整个数组,&arr表示整个数组的地址,数组的地址也是指向数组的起始位置,同strlen(arr) 
printf("%d\n", strlen(&arr+1));//随机值 &arr+1跳过真个数组,来到'f'后面
printf("%d\n", strlen(&arr[0]+1));//随机值 &arr[0]+1跳过一个元素
char arr[] = "abcdef";
(数组有七个元素'a' 'b' 'c' 'd' 'e' 'f' '\0'
//sizeof

printf("%d\n", sizeof(arr));//7     arr表示整个数组
printf("%d\n", sizeof(arr+0));//4/8 arr表示数组首元素地址,arr+0仍然为数组
printf("%d\n", sizeof(*arr));//1    arr为数组首元素地址,*arr为数组首元素
printf("%d\n", sizeof(arr[1]));//1
printf("%d\n", sizeof(&arr));//4/8      &arr为数组地址
printf("%d\n", sizeof(&arr+1));//4/8    &arr+1跳过整个数组
printf("%d\n", sizeof(&arr[0]+1));//4/8 &arr[0]+1跳过首元素

//strlen

printf("%d\n", strlen(arr));//6     arr为数组首元素地址,遇到'\0'中止
printf("%d\n", strlen(arr+0));//6 
printf("%d\n", strlen(*arr));//err  非法访问
printf("%d\n", strlen(arr[1]));//err   非法访问
printf("%d\n", strlen(&arr));//6       &arr为整个数组地址,也是指向数组首元素的起始位置
printf("%d\n", strlen(&arr+1));//随机值 &arr+1跳过整个数组,arr内存后面不确定有无或什么时候遇到'\0'
printf("%d\n", strlen(&arr[0]+1));//5  &arr[0]+1跳过数组首元素,从数组第二个元素开始往后统计

3.二维数组

int a[3][4]={0}

sizeof(a)//48 a表示整个数组,计算的是整个数组的大小
sizeof(a[0][0])//4 表示数组首元素
sizeof(a[0])//16 把二维数组每一行当成一维数组 a[0]表示第一行的数组名,数组名单独使用在sizeof内部 表示数组第一行。计算的是二维数组第一行的大小
sizeof(a[0]+1)//4/8 a[0]并未单独放在sizeof内部 a[0]表示数组第一行的首元素地址,a[0]+1表示数组第一行第二个元素地址
sizeof(*(a[0]+1))//4 a[0]表示第一行首元素地址
sizeof(a+1)//4/8 数组第二行的地址
sizeof(*(a+1))//16 
sizeof(&a[0]+1)//4/8跳过去整个第一行,第二行地址
sizeof(*(&a[0]+1))//16
sizeof(*a)//16
sizeof(a[3])//16

从上我们能够发现, sizeof()中的表达式不执行,sizeof只会判断表达式的最终类型。

代码演示:

    char num = 1;
	int a = 2;
	printf("%d\n", sizeof(num = a++));//1
	printf("%d %d", num, a);//1 2

结果:


总结

以上就是今天要讲的内容,本文简单介绍了sizeof 和 strlen的使用。

祝:健健康康顺顺利利!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值