sizeof
- sizeof是运算符
- sizeof运算符返回表达式或则一个类型名所占的字节数,其返回值是一个size_t类型的常量表达式。
- size_t是一种与机器无关的无符类型,足够大能够表示内存中任意对象的大小
- 常量表达式是指值不会发生改变,在编译过程中就能得到计算结果的表达式,常量表达式必须是一个字面值,或则是使用字面值初始化的const变量
- sizeof(type);sizeof expr;
- sizeof返回表达式运算结果类型的大小而不会计算表达式的值
1 Sales_data data, *p; 2 sizeof(Sales_data);//存储Sales_data类型的对象所占的空间大小 3 sizeof data;//data的类型的大小即sizeof(Sales_data) 4 sizeof p;//指针所占的空间大小 5 sizeof *p;//p所指类型的空间大小,即sizeof(Sales_data) 6 sizeof data.revenue;//Sales_data的revenue成员对应类型的大小 7 sizeof Sales_data::revenue;//另一种获取revenue大小的方式
这里面注意一个变量或则一个实例化的对象可以认为是一个表达式
- 对指针进行sizeof运算,sizeof只会计算指针本身所占的字节数,在64位操作系统中所有类型的指针(包括类类型)都是8个字节,在32位操作系统中所有类型的指针都是4个字节
- 对指针解引用进行sizeof计算,即便指针指向的是空这也是安全的,因为它不会对表达式进行计算,也就是不会解引用,运算结果就是指针的类型所占的字节数,比如int就是4个字节
- 对引用进行sizeof运算,所得的结果就是被引用对象所占的字节数
- 对数组进行sizeof运算,所得的结果是数组中所有元素的大小求和,注意sizeof不会将数组名转换成首地址,也就是不会转换成一个指针
- 对vector进行sizeof运算,所得的结果永远是一个固定值,64位操作系统下是32,无论里面有多少个元素
- 对string进行sizeof运算,所得的结果永远是一个固定值,64位操作系统下是40,无论里面有多少个字符
strlen
strlen是一种C风格字符串的函数,头文件#include<cstring>
C风格字符串:
char s[]={'c','+','+','\0'};
char s[]="c++";
最好不要使用C风格的字符串,不方便而且容易引发程序泄露
sizeof和strlen的区别
- sizeof是运算符,strlen是库函数
- sizeof在编译的时候就计算好了,strlen在运行时计算
- 每个字符串后面都会隐藏一个"\0"字符,sizeof会将"\0"计算进去,strlen遇到"\0"就停止,即便显示将"\0"写出来,它也只是计算"\0"前面的字符,后面的包括"\0"本身不会将它计算进去
- sizeof参数几乎可以是所有类型,strlen参数必须是字符型指针(传入数组自动退化为指针)
1 int main() 2 { 3 4 char p[] = "hello"; 5 cout << "p: " << p << " " << "strlen(p):" << strlen(p) << " " << "sizeof(p):" << sizeof(p) << endl; 6 char p1[] = "hello\0"; 7 cout << "p1: " << p1 << " " << "strlen(p1):" << strlen(p1) << " " << "sizeof(p1):" << sizeof(p1) << endl; 8 char p2[] = "hello\\0"; 9 cout << "p2: " << p2 << " " << "strlen(p2):" << strlen(p2) << " " << "sizeof(p2):" << sizeof(p2) << endl; 10 char p3[] = "hello\\\0"; 11 cout << "p3: " << p3 << " " << "strlen(p3):" << strlen(p3) << " " << "sizeof(p3):" << sizeof(p3) << endl; 12 char p4[] = "hel\0lo"; 13 cout << "p4: " << p4 << " " << "strlen(p4):" << strlen(p4) << " " << "sizeof(p4):" << sizeof(p4) << endl; 14 char p5[] = "hel\\0lo"; 15 cout << "p5: " << p5 << " " << "strlen(p5):" << strlen(p5) << " " << "sizeof(p5):" << sizeof(p5) << endl; 16 17 system("pause"); 18 return 0; 19 }
p1:
\0即便被显示的写出来该字符串中还会有一个隐藏的\0,strlen读到显示的\0就会结束,不会计算这个显示的\0,并且打印字符串的时候显示的\0和它后面的东西不会被打印出来
p2:
\会将它后面的一个字符吸引,和\一起组成一个字符,打印的时候只会显示它后面的那个字符;hello\\0可以写成成h e l l \\ 0(每个字符由空格隔开)
p5:
hel\\0lo可以写成h e l \\ 0 l o(每个字符由空格隔开)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!