sizeof和strlen的区别

这篇博客详细解析了C语言中sizeof和strlen两个关键操作的区别。sizeof是在编译时计算类型或变量的大小,而strlen则是在运行时计算字符串的有效长度。文章通过实例展示了它们在数组、指针及二维数组等不同情况下的应用,强调了数组名在不同上下文中的含义变化。此外,还讨论了在函数参数传递时数组如何退化为指针的情况。
摘要由CSDN通过智能技术生成

区别

sizeof是C语言里面的关键字,strlen是C语言里面的库函数;
sizeof求的是类型的大小,strlen求的是有效字符串的大小;
sizeof不需要添加头文件,strlen要添加相关头文件;
sizeof在编译期间就可以算出来值的大小,是推断出来的,可能并没有进行运算,strlen在代码运行起来以后才知道值的大小

习题

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));  //16
//a代表整个数组,求的是数组的大小,a中共有4个元素,每个元素都是int类型,共占16字节
printf("%d\n",sizeof(a+1));  //4
//a代表首元素的地址,(a+1)代表第二个元素的地址,所以是4
printf("%d\n",sizeof(&a)); //4
//代表整个数组的地址,指针大小都是4字节
printf("%d\n",sizeof(*&a));  //16
//先对整个数组&再* 求的是整个数组的大小

数组名代表数组首元素的地址,在两种情况下,数组名代表整个数组,其一是sizeof,其二是&

char arr[] = {'a','b','c','d','e','f'}; 
printf("%d\n", sizeof(arr)); //6
//求的是数组大小
printf("%d\n", sizeof(arr+0)); //4
//求的是第0个元素的地址大小
printf("%d\n", strlen(arr)); //随机值
//strlen遇到'\0'才停止,该数组里面没有'\0',同下
printf("%d\n", strlen(arr+0));//随机值
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); //7
//整个数组的大小,还有一个'\0'
printf("%d\n", sizeof(arr+0)); //4
//数组第0个元素地址大小
printf("%d\n", strlen(arr));//6
//求字符串的长度,遇到'\0'停止
printf("%d\n", strlen(arr+0));//6
//遇到'\0'停止
char *p = "abcdef";
printf("%d\n", sizeof(p)); //4
//p是一个指针,求的是指针大小
printf("%d\n", strlen(p));  //6
//求字符串的长度,遇到'\0'停止
printf("%d\n", strlen(p+1)); //5
//p+1到b的地址,求的是字符串的长度,遇到'\0'停止
//二维数组
int a[3][4] = {0};
printf("%d\n",sizeof(a)); //48
//整个数组的大小,共有12个int类型的元素
printf("%d\n",sizeof(a[0])); //16
//求的是shuzudi0行的大小,共有4个int类型的元素
printf("%d\n",sizeof(a[0]+1)); //4
//a[0]+1还是一个地址
printf("%d\n",sizeof(a+1)); //4
//a是一个地址,加一还是一个地址
printf("%d\n",sizeof(a[3])); //16
//虽然并没有第3行,但是并不会报错,因为sizeof只是推断这个类型
//的大小,并没有真正去运行它
void Func(char str[100])
{
	printf("%d\n", sizeof(str)); //4
}
//因为数组在传参的时候会退化成指针
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值