sizeof/strlen/length
1.sizeof()
sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
数组——编译时分配的数组空间大小,不退化为指针;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小(函数的返回类型不能是void)。
2.strlen()
strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*),且必须是以''\0''结尾的。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL,返回的长度大小不包括NULL。
3.length()
length( )和size( )返回字符串中的字节数。length是因为沿用C语言的习惯而保留下来的,string类最初只有length,引入STL之后,为了兼容又加入了size,它是作为STL容器的属性存在的,以便用于STL的算法。string类的size()/length()方法返回的是字节数,不管是否有汉字。
相关测试代码:
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; int main() { string s = "abcde"; // string被字符串赋值后只包含字符串本身,不包括'\0' char ch1[] = "abcde"; // ch1[5] = "abcde" -----------------------> ERROR char ch2[] = {'a', 'b', 'c', 'd', 'e'}; // ch2[5] = {'a', 'b', 'c', 'd', 'e'} -----> RIGHT printf("s.length() = %d\n", s.length()); // s.length() = 5 printf("sizeof(ch1) = %d\n", sizeof(ch1)); // sizeof(ch1) = 6 printf("sizeof(ch2) = %d\n\n", sizeof(ch2)); // sizeof(ch2) = 5 /*----------------------------- 以上区别字符串和字符数组 ----------------------------------- ------------------------------------------------------------------------------------------*/ string str[5] = {"I", "am", "fine", "thank", "you"}; printf("sizeof(char) = %d\n", sizeof(char)); // 1 printf("sizeof(string) = %d\n\n", sizeof(string)); // 4 printf("sizeof(ch2) = %d\n", sizeof(ch2)); // 5 ----> 数组名不会退化为指针 printf("sizeof(str) = %d\n\n", sizeof(str)); // 20 ----> 数组名不会退化为指针 printf("sizeof(ch2[0] = %d\n", sizeof(*ch2)); // 1 printf("sizeof(str[0]) = %d\n\n", sizeof(*str)); // 4 ----> 指针所指向字符所占用空间 /*----------------------------- 以上string[]和char[]共同点 --------------------------------- ------------------------------------------------------------------------------------------*/ char *ch4 = "0123456789"; char ch3[20] = "0123456789"; printf("sizeof(ch4) = %d\n", sizeof(ch4)); // sizeof(ch4) = 4 ----> 计算的是指针所占空间 printf("sizeof(ch3) = %d\n", sizeof(ch3)); // sizeof(ch3) = 20 ----> 数组名不会退化为指针 printf("strlen(ch3) = %d\n\n", strlen(ch3)); // strlen(ch3) = 10 ----> 数组名退化为指针 printf("strlen(ch1) = %d\n", strlen(ch1)); // strlen(ch1) = 5 ----> 定值,ch1以'\0'结尾 printf("strlen(ch2) = %d\n\n", strlen(ch2)); // strlen(ch2) = 10 ----> 不定值,ch2没以'\0'结尾 /*----------------------------- 以上sizeof, strlen使用特点 --------------------------------- ------------------------------------------------------------------------------------------*/ string ss = "你好世界"; printf("ss.size() = %d\n", ss.size()); // ss.size() = 8 printf("ss.length() = %d\n", ss.length()); // ss.length() = 8 /*----------------------------- 以上C++中string类求长度方法 --------------------------------- ------------------------------------------------------------------------------------------*/ return 0; }