字符串中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';

字符串中size()、length()与sizeof()用法及区别_第1张图片

   因此: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指向长度为3的arr4数组所在的地址。
string ss = arr; // sizeof(ss)的值为32,并不是4;

经典考题:

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

问题解析:

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的地址开始搜索,直到遇到结束符为止的长度,不包括结束符。       

 

你可能感兴趣的:(【c笔记】)