概述
大家清楚 sizeof 和 strlen 的区别吗?
sizeof是运算符,确定的是字符所占空间大小,参数可以有数组、指针、类型、对象、函数等。
strlen是C语言的标准库函数,确定是字符串的大小,目的是找到 , 之前出现多少个字符,字符串长度就是几,如果找不到可能就是随机值。
数组名是首元素地址,除了以下两个条件外,其他都是首元素地址
1.sizeof(数组名)----数组名表示整个数组
2.&数组名----数组名表示整个数组
下面有三组数组例题:
大家可以自行验证,每一行后面都有我写的答案和解析
1、数组里放存放整型数字
int a[]={1,2,3,4};
printf("%dn",sizeof(a));//16 sizeof(数组名)-计算的是整个数组总大小,也就是4*4=16
printf("%dn",sizeof(a+0));//4/8 a表示首元素地址,a+0还是表示首元素地址,没有变化
printf("%dn",sizeof(*a));//4 数组名表示首元素地址,*a表示解引用首元素,也就是首元素的大小,占4个字节
printf("%dn",sizeof(a+1));//4/8 数组名表示首元素的地址,a+1表示第二个元素的地址,地址大小4/8字节
printf("%dn",sizeof(a[1]));//4 a[1]表示第二个元素,所以sizeof(a[1])也就是第二个元素大小4字节
printf("%dn",sizeof(&a));//4/8 &a表示取数组地址,数组地址那也是地址,也是4/8字节
printf("%dn",sizeof(*&a));//16 &a表示取数组地址,*&a表示解引用取数组地址,则*和&可看成相互抵消,最后剩个a,等于sizeof(a),也就是数组总大小16字节
printf("%dn",sizeof(&a+1));//4/8 &a表示取数组地址,&a+1表示跳过一整个数组的地址,也就是下一个数组地址,但也还是地址,所以是4/8字节
printf("%dn",sizeof(&a[0]));//4/8 &a[0]表示取第一个元素地址,是地址就是4/8字节
printf("%dn",sizeof(&a[0]+1));//4/8 &a[0]+1表示取第二个元素地址,是地址就是4/8字节
2、数组里存放字符
sizeof用法计算
char arr[]={'a','b','c','d','e','f'};
printf("%dn",sizeof(arr));//6 sizeof计算的是整个数组大小,6*1=6个字节
printf("%dn",sizeof(arr+0));//4/8 arr是首元素的地址,arr+0没有变化,还是首元素的地址,地址的大小是4/8个字节
printf("%dn",sizeof(*arr));//1 arr是首元素地址,*arr解引用就是首元素,首元素大小是1个字节
printf("%dn",sizeof(arr[1]));//1 arr[1]是第二个元素的大小,爷还是1个字节
printf("%dn",sizeof(&arr));//4/8 &arr虽然是数组的地址,但是还是地址,也就还是4/8字节
printf("%dn",sizeof(&arr+1));//4/8 &arr+1是跳过整个数组后的地址,地址大小还是4/8字节
printf("%dn",sizeof(&arr[0]+1));//4/8 第二个元素的地址,只要是地址,那就是4/8字节
strlen用法计算
//strlen目的是找到 , 之前出现多少个字符,字符串长度就是几
printf("%dn",strlen(arr));//随机值 因为arr数组中没有 ,所以不会停下来一直找下去,直到找到 为止
printf("%dn",strlen(arr+0));//随机值 arr+0还是表示首元素地址,从首元素地址找下去,arr数组中没有 ,所以还是会一直找下去
printf("%dn",strlen(*arr));//程序出错 因为*arr表示解引用元素首地址,也就是首元素字符a,a代表97,也就是把97当作地址传过去,非法访问,程序会崩溃
printf("%dn",strlen(arr[1]));//程序出错 arr[1]是第二个元素,也就是把字符b传过去,b代表98,非法访问,出错原因跟上一个一样
printf("%dn",strlen(&arr));//随机值 &arr取首元素地址,结果跟第一、二个一样,找不到 ,随机值
printf("%dn",strlen(&arr+1));//随机值-6 &arr+1表示从下一个数组开始起寻找 ,跳过了数组arr,也就是跳过了6个字节,所以比上一个小6
printf("%dn",strlen(&arr[0]+1));//随机值-1 &arr[0]+1表示从第二个元素的地址开始寻起,所以比第一个strlen少1个字节,但也是随机值
二维数组sizeof用法
int a[3][4]={0};
printf("%dn",sizeof(a));//48 计算的是数组总大小,也就是3*4*4=48
printf("%dn",sizeof(a[0][0]));//4 a[0][0]是数组第一个元素,所以是4个字节
printf("%dn",sizeof(a[0]));//16 此处a[0]相当于第一行作为一维数组的数组名,而因为a[0]是数组名单独放进sizeof()内的,所以计算的是第一行的大小
printf("%dn",sizeof(a[0]+1));//4/8 a[0]是第一行数组名,而a[0]+1是数组第一行第二个元素地址,并不是指第二行地址,所以是4/8字节
printf("%dn",sizeof(*(a[0]+1)));//4 a[0]+1是第一行第二个元素地址,解引用则是第一行第二个元素。所以是4个字节
printf("%dn",sizeof(a+1));//4/8 a不是单独放在sizeof内,所以数组名表示第一行地址,a+1则表示第二行地址,是地址就是4/8
printf("%dn",sizeof(*(a+1)));//16 解引用第二行地址,也就是计算第二行的大小,所以是16
printf("%dn",sizeof(&a[0]+1));//4/8 &a[0]表示取第一行的地址,+1则表示取第二行的地址,是地址就是4/8
printf("%dn",sizeof(*(&a[0]+1)));//16 解引用第二行地址,也就是第二行大小,所以是16
printf("%dn",sizeof(*a));//16 a表示第一行,*a则是解引用第一行,所以计算的是第一行的大小,是16字节
printf("%dn",sizeof(a[3]));//16 a[3]虽然看起来是第四行,可实际上sizeof不会访问超出的部分,只会访问跟sizeof(a[0])一样的类型,所以计算的还是一行的大小,是16
sizeof和strlen看似简单,可实际上,这些题得出答案的原因你是否都会吗
最后
以上就是贤惠钢铁侠为你收集整理的C语言:sizeof和strlen计算有关数组字节大小的全部内容,希望文章能够帮你解决C语言:sizeof和strlen计算有关数组字节大小所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复