关于sizeof与strlen网上已经有很多的总结了,很多写的也相当全面。但人家牛x,和我没什么关系,自己也总结一下,加深一下印象,以后慢慢补充吧。
1.sizeof是操作符,strlen是函数。
只是二者最本质的区别,这样就好理解她们的特性差异啦!
sizeof后面跟的是数据类型(type)时,必须加();
sizeof后面跟的是变量(var)时,无需加();
2.从操作对象和参数来说,即输入来说
sizeof可以跟数据类型、变量名、数组名(也算是一种数据类型吧),不能用于函数和不完全类型
strlen就单调一点啦,只能接受char*类型的参数,并且以'/0'结尾
3.从返回结果来说,即输出来说
sizeof返回的是 size_t 类型,在头文件中就是用typedef 重新给unsigned int起了个小名,
返回的是相应操作对象在内存中的实际存储字节数
strlen返回的也是 size_t 类型,
不同的是返回的是字符串的字符个数
4.一些小细节(大致了解就行)
sizeof数组作为操作对象不会退化,而strlen退化为普通指针;
sizeof是在编译前就计算出来的,而strlen则是在运行时才计算的
5.更高级的好像还有数据对齐的问题
主要是针对结构体的sizeof值存在一些特殊的计算方法,可能是为了提高计算机存取速度,
可以通过#pragma pack ()设置对齐方式,感兴趣的可以自己查一下,用的时候在研究
Wait a minute 最后就几个实例,验证一下成果:
<a>定义char szNum[10]={"12345"};
输出 sizeof(szNum);
strlen(szNum);
分别是什么
<b>定义char * szNum = "12345";
输出 sizeof(szNum);
sizeof(*szNum);
strlen(szNum);
分别是什么
答案:<a>10,5
<b>4(为什么是4?因为szNum是指针类型,指针是以4字节存储的),1,5