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指向长度为3的arr4数组所在的地址。
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的地址开始搜索,直到遇到结束符为止的长度,不包括结束符。

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

  1. @ini_get php,php中get_cfg_var()和ini_get()的用法及区别_php技巧_脚本之家

    本文实例讲述了php中get_cfg_var()和ini_get()的用法及区别.分享给大家供大家参考.具体分析如下: php里get_cfg_var()和ini_get()都是取得配置值的函数,当你 ...

  2. 【Java学习笔记之二十九】Java中的equals和==的用法及区别

    Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String(&quo ...

  3. Python学习笔记(一)1.Python中end=和sep=的用法与区别。

    一.Python中end=和sep=的用法与区别: python中常用到的end=和sep=两种参数用法相似,一个是python输出结尾,一个是python输出分割. end: 默认是换行,表示两个字 ...

  4. php在类定义一个我静态变量,php中静态类与静态变量用法的区别分析_PHP教程

    php中静态类与静态变量用法的区别分析 static是定义一个静态对象或静态变量,关于static 定义的变量或类方法有什么特性我们看完本文章的相关实例后就见分晓了. 1. 创建对象$object = ...

  5. MySQL中索引与视图的用法与区别详解

    索引与视图是我们在日常使用mysql必不可少的一部分,最近在学习中看到一本书中关于这方法写的不错,所以这篇文章主要给大家介绍了关于MySQL中索引与视图的使用与区别的相关资料,需要的朋友可以参考借鉴, ...

  6. 统计字符串长度,strlen和sizeof有啥区别?

    本文来自公众号:C语言编程技术分享 一.练习 字符串函数strlen和运算符sizeof是我们学习C语言很常见的两个东东,也是用的比较多的.如果把这二位用在统计字符串的长度上,它们有什么区别呢?就比如 ...

  7. JS中innerHTML,innerText,outHTML的用法及区别

    一张图解释: 对于一个id为"testdiv"的div来说,outerHTML.innerHTML以及innerTEXT三者的区别可以通过下图展示出来: 文字解释: innerHT ...

  8. c++ 在函数中传递数组和sizeof用法注意事项

    2019独角兽企业重金招聘Python工程师标准>>> 通常,指向数组第一个元素的指针会传入函数,同时还需传入数组的大小(后面会详细解释) void by_pointer(int * ...

  9. 以下代码中的两个sizeof用法有问题吗?

    void UpperCase( char str[] ) { for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i ) if( 'a'<=s ...

最新文章

  1. 准确率99.9%!如何用深度学习最快找出放倒的那张X光胸片(代码+数据)
  2. mahout demo——本质上是基于Hadoop的分步式算法实现,比如多节点的数据合并,数据排序,网路通信的效率,节点宕机重算,数据分步式存储...
  3. win7开启休眠功能
  4. smartform 中currency 字段的小数点问题
  5. 进程调度之最短作业优先
  6. 作家百态之二:山南海北
  7. Spring Data REST 远程代码执行漏洞(CVE-2017-8046)分析与复现
  8. mysql联合索引和单索引_mysql联合索引跟单列索引的区别
  9. A + B Problem II
  10. 如何实现一个优秀的散列表!
  11. LeetCode 458. 可怜的小猪(信息论方法)
  12. 点击编辑table变为可编辑状态
  13. linux下网络配置 命令
  14. (原创)十大危险cmd命令代码总结
  15. 计算机中硬盘和移动硬盘的区别,固态硬盘与移动硬盘有哪些区别?
  16. 如何把无限循环小数转换成分数形式
  17. 百度没有文化(转载)
  18. 独家 | 零基础入门优化问题
  19. 日式风格小荷才露尖尖角
  20. hp服务器 linux,在Linux中监控HP和Dell的服务器(SNMP,Cacti)

热门文章

  1. MQTT的RETAIN标志位的作用
  2. FZU Problem 2243 Daxia like uber(最短路)
  3. 华为OD机试 - 射击比赛(Python)
  4. PCM(脉冲编码调制)的折叠码原理
  5. 按键精灵Mid()函数截取字符串:字符串从第几位开始取,取出几个字符
  6. 如何建立文献之间的引证关系
  7. 数学建模中目标函数与约束条件化简方法总结
  8. 内存泄漏,关于异步回调导致的内存泄漏,使用LeakCanary检测内存泄漏
  9. 机器码,汇编语言,C语言,C++发展的认识
  10. 史上最全的《Android面试题及解析》,一篇文章帮你解答