2.sizeof和strlen

发布时间 2023-07-21 16:37:18作者: 小凉拖

sizeof

  • sizeof是运算符
  • sizeof运算符返回表达式或则一个类型名所占的字节数,其返回值是一个size_t类型的常量表达式。
  1. size_t是一种与机器无关的无符类型,足够大能够表示内存中任意对象的大小
  2. 常量表达式是指值不会发生改变,在编译过程中就能得到计算结果的表达式,常量表达式必须是一个字面值,或则是使用字面值初始化的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(每个字符由空格隔开)