很多初学者在学习C语言时总会把sizeof和strlen弄混,本人作为一名刚学代码不久的小白,将以自己的视角来为大家解读它俩的关系及用法。
(作为一名初学者,难免会有不足与缺陷,希望大家能够在评论中给出自己的意见和建议)
1.简单描述
它们俩虽然长得都像函数,实际上并非如此,strlen是库函数的一员,但sizeof是一个单目操作符,并非函数。在编程中可以直接使用sizeof,而使用strlen函数时注意加上头文件 #include <string.h>
当然,大家最关心的计算功能,毫无疑问二者都可办到。
strlen
计算字符串长度(字符串内的字符数),只能针对字符串
在计算长度时,遇到'\0'即会停止(每个字符串的末尾都会隐藏一个'\0')
所计算的时'\0'之前的字符个数;
sizeof 属于运算符
sizeof是用来计算变量或者类型所占空间的大小的,任何类型都可以使用,单位是字节
并且只关心字符串大小,不在乎内存中是否存在'\0'
并且计算时会把'\0'算在内;
2.深入探索
光说概念只会让人懵懵懂懂,所以,我想用代码来继续讲解
#include <stdio.h>
int main()
{
int a = 10;
int arr[10] = { 1,2,3,4,5 };
printf("%d\n", sizeof(a)); //打印结果为4 第一行
printf("%d\n", sizeof a); //4 第二行
printf("%d\n", sizeof(int)); //4 第三行
printf("%d\n", sizeof(char));//1 第四行
printf("%d\n", sizeof(arr)); //40 第五行
return 0;
}
对于我们初学者来说,代码的格式也需要注意的一点
大家看到第一、二、三行的打印结果均为4,是因为sizeof所计算的是a的类型int,
int是整形,在内存中所占4个字节(byte),而sizeof后面跟(a)或(int),所以打印结果为4。
同样我在第四行也用char向大家展示了sizeof的用法,能够计算出char在内存中所占一个字节。
而对于sizeof(arr)来说,arr数组中并不只有5个元素,而是有10个元素, {1,2,3,4,5,0,0,0,0,0};又因为是int型的arr数组,打印结果是40。
还记得我在开头所说的两者和'\0'的关系么
#include <string.h>
int main()
{
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//打印结果为7
printf("%d\n", strlen(arr));//打印结果为6
return 0;
}
毫无疑问,在arr数组中有6个元素,那么sizeof和strlen打印的结果都应该是6啊,
不同结果的原因,都是在'\0'这个略显神秘的字符上; '\0'是字符串结束的标志
其实,在每个字符串的,末尾都会隐藏一个字符'\0',
大家可以看到,在arr[6]这个位置,放置了'\0',这也就是为什么二者打印结果不同的原因,
在计算时sizeof包含'\0',strlen则不包含。
3.sizeof的"特性"
我个人认为sizeof真的是个很有意思的“玩意”,长的一副函数的面孔却不是函数,而且本身还有许多特点,接下来,我就来和各位一起看看。
我们都知道,在函数传参时如果你传递的是(arr),并不会把整个数组都传递过去,它传递的是数组的首元素的地址,就像这样
#include <stdio.h>
void fac(char *p)
{
;
}
int main()
{
char arr[5] = {1,2,3,4,5};
fac(arr);
return 0;
}
在fac函数中我用*p这个指针来接收所传过来的arr首元素的地址,
那么,有没有什么“玩意”能包括整个arr数组呢?
哈哈,那自然是sizeof了(&arr也可以),正因为这个特性,我们便可以利用它计算字符串的长度
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int ret = sizeof(arr) / sizeof(arr[0]);
//40 //4 相除得到字符串长度10
printf("%d\n", ret);
return 0;
}
因为是int型,所以sizeof(arr)(整个字符串长度)/ sizeof(arr[0])(arr首元素的地址)就可以得到字符串的长度了。
4.总结
关于sizeof和strlen的区别和用法,其实并不太多,或者取决于本人水平有限,还请各位读者在评论中表达自己的意见和建议。