sizeof()详解
1.sizeof()作用:计算变量/类型所占内存大小,单位是字节。(计算字符串函数大小时包含’\0’)
int a = 10;
int b =sizeof(a); //a为int类型,大小为4个字节
int c = sizeof(int); //4
2.sizeof是操作符,不是函数 ,所以sizeof的参数可以是数组,指针,类型,对象,函数等。
举个例子:sizeof(类型)可以 sizeof 类型是错误的。
int main()
{
int a, b, c, d;
a = sizeof(a);
b = sizeof a;
c = sizeof(int);
//d = sizeof int; //错误
printf("%d %d %d\n", a, b, c); // 4 4 4
return 0;
}
3.sizeof ()内部的表达式不参与真实运算,编译器在编译时就计算出了sizeof的结果。
int main()
{
int a = 10;
int b = sizeof(a = a + 1);
printf("%d %d \n", a, b); // 10 4
return 0;
}
注:sizeof内部即使写的是赋值表达式也不会去真实的运算,sizeof在计算的时候只看操作数的类型,不会访问对应的空间 。
4.sizeof()与数组名的关系(重难点)
sizeof(数组名):此时的数组名代表的是整个数组
&数组名:此时的数组名代表的也是整个数组
其他情况,数组名代表的是首元素地址(+0,+1…发生偏移引用)
int arr[10];
a = sizeof(arr); //计算的是整个数组的大小 4*10 = 40
b = sizeof(&arr); //取出整个数组的地址,是地址(指针),32位:4 64位:8
5.sizeof()容易出错的地方
int i ; //全局变量未初始化系统默认为0
int main()
{
i--; //i变成-1
if(i > sizeof(i))
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}
打印结果: >
注:sizeof(i)和i比较时,sizeof返回类型为size_t 而i的类型为int,最终是用size_t比较,对于-1的补码为:全1序列,如果看成是无符号数的话,对于的值比sizeof(i) = 4大。
二.strlen()详解
1.strlen()作用:求字符串长度的库函数,遇到\0即停止计算(不包括\0);
2.需要引用#include<string.h>头文件;
3.注意返回类型为:size_t(unsigned int 无符号整型)。
##include <stdio.h>
#include <string.h>
int main(void){
char str [50] = "HelloWorld'\0'Hi";//定义字符数组str容量:50
int len = strlen(str);//定义整数类型int len,然后把strlen(str)计算出来的长度赋值给len
printf("len的长度:%d\n",len);
return 0;
}
HelloWorld’\0’Hi共计13个字符,然而打印出来的结果却只有11个,这是因为strlen()函数在计算长度的时候,碰到’\0’空格键的时候便不再计算后面的长度,计算长度"HelloWorld"+‘共11个,不包括\0’。
三.strlen()与sizeof()的区别
1.共同点:返回类型都是size_t;
2.不同点:sizeof()是操作符计算的是变量/类型所占空间的大小,单位是字节,\0也算进空间;
3.strlen()是库函数,计算的是字符串长度,不计算\0。
int main()
{
char arr1[] = { 'a','b','c' };
int ret1 = strlen(arr1);
int ret2 = sizeof(arr1);
printf("%d %d\n", ret1,ret2); //随机值 3
//arr1并没放入\0,strlen()向后直到找到\0才停止,所以是随机值 而arr1本身数组元素个数为3,根据后面初始化的内容确定了数组的大小,sizeof:3*1 = 3
char arr[] = "abcdef";
int ret3 = strlen(arr);
int ret4 = sizeof(arr);
printf("%d %d\n", ret3, ret4); //6 7
//arr大小为7,含\0 strlen不算\0
return 0;
}
以上列举了几种strlen()和sizeof()相关的问题,这一方面坑点挺多的,欢迎大家来评论区或私信点赞一起学习,一起进步!
以上为个人总结及网络来源资料查询总结而成,如发现错误,请及时告知删改!