《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进行熟练的掌握,具体是怎么计算大小长度的,这里面的关系必须理清楚,所以了解这两者之间的区别,必须吃透本质的含义。