《sizeof和strlen进阶笔试常考类型》

《sizeof和strlen进阶,笔试常考类型》


1.sizeof和strlen的区别

(1)关键字 sizeof 是一个单目运算符,而不是一个函数, sizeof 在编译时计算缓冲区的长度。由于在编译时计算,因此 sizeof 不能用来返回动态分配的内存空间的大小。sizeof计算占用的内存空间计入‘\0’。而strlen 是一个函数,它用来计算字符串 str 的长度,但不计入‘\0’(即 null 字符)
注意:在计算过程中一定要注意数组转成指针的操作。比如(数组作为函数参数、加减运算、解引用、比较操作等),在32位操作系统上sizeof计算的参数是指针类型,则结果是固定的值4.

2.各种数据类型具体的含义

(1)sizeof计算一维数组例子:

	int a[] = {1,2,3,4};
	printf("%d\n",sizeof(a));
	printf("%d\n", sizeof(a+0));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(&*a));
	printf("%d\n", sizeof(&a));
	printf("%d\n", sizeof(*&a));
	printf("%d\n", sizeof(&a + 1));
	printf("%d\n", sizeof(&a[0]));
	printf("%d\n", sizeof(&a[0]+1));

依次输出的sizeof大小是:16、4、4、4、4、4、16、4、4、4.
在计算sizeof的时候必须清楚的掌握sizeof( )括号中代表的具体含义是什么,这才能明白具体是怎么回事。
(2)strlen计算字符数组的例子:

	printf("%d\n",strlen(arr));
	printf("%d\n", strlen(arr+0));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));

依次输出的strlen大小是:6、6、6、12、5
其实在这里面第三、四句已经出现了类型不匹配,有些编译器在编译的时候就能检测出此类问题来,具体是因为什么,我就不直接说答案了,欢迎评论区交流。
(3)经典笔试题1

	int aa[2][5] = {1,2,3,4,5,6,7,8,9,10};
	int *ptr1 = (int *)(&aa + 1);
	int *ptr2 = (int *)(*(aa + 1));
	printf("%d,%d\n",*(ptr1-1),*(ptr2-1));

输出结果是:10 、5

(4)

	char *c[] = {"ENTER","NEW","POINT","FIRST"};
	char **cp[] = {c+3,c+2,c+1,c};//这相当于cp[]={FIRST,POINT,NEW,ENTER};
	char ***cpp = cp;
	printf("%s\n",**++cpp);

输出结果是:POINT

有什么疑惑评论区里一起见证哦。


总结

今天就简单的对sizeof和strlen进行熟练的掌握,具体是怎么计算大小长度的,这里面的关系必须理清楚,所以了解这两者之间的区别,必须吃透本质的含义。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值