参考
- C++ Primer
sizeof运算符
sizeof运算符返回一条表达式或者一个类型名字所占的字节数,返回值是size_t类型的常量表达式。
size_t是一种机器相关的无符号类型,它被设计的足够大以便能表示内存中任意对象的大小。
sizeof (类型)
sizeof 表达式//返回表达式结果类型的大小,sizeof并不实际计算其运算对象的值
//定义一个student类型
struct student {
std::string name;
int number = 0;
}
student stu1, *p;
sizeof (student);//存储student类型的对象所占空间的大小
sizeof stu1;//stu1的类型的大小,即sizeof(student)
sizeof p;//指针所占的空间大小
sizeof *p;//等价于sizeof (*p),p所指类型的空间大小,即sizeof(student)
sizeof stu1.number;//student的number成员对应类型的大小
sizeof student::number;//另一种获取number大小的方式,作用域运算符来获取类成员的大小
注:因为sizeof不会实际求运算对象的值,所以即使p是一个空指针也是安全的,sizeof不需要真正解引用指针也知道它所指对象的类型。
-
对char或者类型为char的表达式执行sizeof运算,结果为1
-
对引用类型执行sizeof运算得到被引用对象所占空间的大小
-
对指针指针sizeof运算得到的得到指针本身所占空间的大小
-
对解引用指针指针指向sizeof运算得到指针指向的对象所占空间的大小,指针可以是空指针,只要知道指针所指向的对象类型
-
对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中的所有元素各执行一次sizeof运算并将结果求和
int a[] = {1, 2, 3, 4, 5}; sizeof (a);//20; sizeof (*a);//4; sizeof (a[0]);//4; char a[] = {1, 2, 3, 4, 5}; sizeof (a);//5; sizeof (*a);//1; sizeof (a[0]);//1;
-
对string对象或者vector对象指向sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间
vector<int> v1(10, 1);//10个元素,每个值都是1 vector<int> v2{1};//1个元素,值为1 string str1 = "a"; string str2 = "aaaaa"; sizeof v1;//24 sizeof v2;//24 sizeof str1;//32 sizeof str2;//32
strlen
strlen是一种C风格字符串的函数,定义在头文件cstring中,cstring是C语言头文件string.h的C++版本
尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。因为C风格字符串不仅使用起来不方便,而且极易引发程序漏洞
C风格字符串不是一种类型,而是为了表达和使用字符串而形成的一种约定俗成的写法。
size_t strlen(const char *str)//strlen的声明
char *p = "aaa";
char q[] = "bbbb";
strlen(p);//返回p的长度等于3,空字符不计算在内
strlen(q);//返回q的长度等于4,空字符不计算在内
C风格字符串的函数拓展
extern int strcmp(const char* str1, const char* str2);//函数原型
strcmp(p1, p2);//比较p1和p2的相等性,如果p1 == p2,返回0;如果p1 > p2,返回一个正值;如果p1 < p2,返回一个负值
extern char *strcat(char *dest,char *src);//函数原型
strcat(p1, p2);//将p2附加到p1之后,返回p1
extern char *strcpy(char *dest, const char *src);//函数原型
strcpy(p1, p2);//将p2拷贝给p2,返回p1