字符串中size()、length()与sizeof()用法及区别

1、string中的size()和length()计算字符串中真实有意义的字符的长度

字符串的size()函数返回字符串的长度,不包括结束符'\0';

    string a = "abcd";或string s = "abd\0"; 
    cout << "a.size(): " << a.size() << endl;
    cout << "a.length(): " << a.length() << endl;

     输出的都是: 4;  //不包括‘\0'; 

    char p[] = { 'a', 'b', 'c', 'd', '\0' };
    string str = p;
    cout << "str.size(): " << str.size() << endl;
    cout << "str.length(): " << str.length() << endl;

    输出的是:4;  //不包括‘\0';

   因此:string中的size()表示字符串中真实有意义的字符的长度,结束符只是用于标记该字符串的结束,并无实际意义,所以不算在长度里面。

 

2、操作符sizeof(类型名 表达式)返回一个对象或者类型所占的内存字节数

  数组的sizeof值等于数组所占用的内存字节数。//(char占1个字节,int占4个字节) 

char a1[] = "abc";   sizeof( a1 ); // 结果是4,字符末尾还存在一个NULL终止符

int a2[3];  sizeof( a2 ); // 结果是3*4=12(依赖于int)

 char arr[] = {'a','b','c','\0'}; //sizeof(arr);的值为4,包括结束符'\0';

/////char arr2[] = {'a','b','c'};//不建议这种写法,加上字符串结束符'\0'会更好。// sizeof(arr2);的值为3;

 char arr3[20] = {'a','b','c','d','e','\0'};  sizeof(arr3);的值为20,这里要注意,并不是6.

  char arr4[] = "ab";

   char *p = arr4;//字符串尾部自动加上字符串结束符'\0',故数组arr4的长度为3.

    sizeof(arr4); //值为3,这并不是2,用字符串字面值初始化字符数组时,会自动在字符串后面添加结束符'\0',所以数组的长度会包括'\0'。

     sizeof(p);//值为4,因为p是指针,指针在32位系统中占4个字节,所以sizeof(p)的值为4,只不过p是指向长度为3arr4数组所在的地址而已。

      string ss = arr; // sizeof(ss)的值为32,并不是4

经典考题:

double* (*b)[3][6];

cout<<sizeof(b)<<endl; // 4 a为指针

cout<<sizeof(*b)<<endl; // 72 *b为一个有3*6个指针元素的数组

cout<<sizeof(**b)<<endl; // 24 **b为数组一维的6个指针

cout<<sizeof(***b)<<endl; // 4 ***b为一维的第一个指针

cout<<sizeof(****a)<<endl; // 8 ****b为一个double变量

问题解析:

b是一个很奇怪的定义,表示一个指向double*[3][6]类型数组的指针。既然是指针,所以sizeof(b)就是4。

既然b是执行double*[3][6]类型的指针,*b就表示一个double*[3][6]的多维数组类型,因此sizeof(*b)=3*6*sizeof(double*)=72。

同样的,**b表示一个double*[6]类型的数组,sizeof(**b)=6*sizeof  (double*)=24。

***b就表示其中的一个元素,也就是double*了,所以sizeof(***b)=4。

****b,就是一个double了,所以sizeof(****b)=sizeof(double)=8。

 

扩展:

       在C语言中,与strlen函数不同的是,sizeof不是一个函数,而是判断数据类型或者表达式长度符的关键字,也可以说是C/C++中的一个操作符(operator),其作用就是返回一个对象或者类型所占的内存字节数。

注意:字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来!!!!!!!!!!!

、如何求数组中元素的个数?(以下两种方式是等价的)

int len0 = sizeof(a1)/sizeof(char);//总长度/单个元素的长度  char

int len1 = sizeof(a2)/sizeof(a2[0]);//总长度/第一个元素的长度  int 

若使用的是sizeof(表达式),那么该语句并不会对表达式本身求值。

int a = 4;

 sizeof(a+=3); //执行完这条语句后,sizeof(a)的值并没有改变为7,仍然是4

extern unsigned int strlen(char *s)这个函数,返回的是从s的地址开始搜索,直到遇到结束符为止的长度,不包括结束符。       

猜你喜欢

转载自blog.csdn.net/qq_30460949/article/details/89109807