数组以及字符串的sizeof(),strlen(),以及string的length(),size()

1、sizeof()--求所占的字节数

字节数就是指数据存在计算机里花了多少字节,比如说一个int类型所占字节数是4,char类型所占字节数为1;int* (整型指针所占字节数为4),char*(字符指针所占字节数也为4)
有了这个背景,那么以下的程序就比较好理解了:

(1)、对于整型字符型数组
int A[]={1,4,5,2,8,6,0};
//求整型数组A所占的字节数
int i=sizeof(A);//i表示整型数组A所占的总空间的字节数
cout<<” i=sizeof(A)= ”<<i<<endl;//此时,i=7*4=28
i=sizeof(A)/sizeof(int);//此时i表示数字数组的元素个数 i=7
char B[]={'a','b','c'};
i = sizeof(B);
cout<<i<<endl;//结果为3*sizeof(char)=3
//求字符数组的元素个数
i=szieof(B)/sizeof(char);           //结果为3
char C[]="abcde";
i = sizeof(C);
cout<<i<<endl;//结果为6*sizeof(char)=6,最后一个为’\0’
(2)、对于整型或字符型指针
int *p;
int A[]={1,2,3,4,5};
p=A;
int i= sizeof(p);// i=4;p为整形指针,大小为定值为4
int i = sizeof(*p);//i=4;此时i就是p所指的整型数组A的第一个元素A[0]的所占字节数

2、strlen()---字符数组或者字符串所占的字节数

strlen()函数可以看作是一个计数器,从某一位置开始,一直到碰到第一个字符串结束符‘\0’为止。它返回的是字符串或者字符数组的实际长度。

(1)字符数组
char A[4]={'a','b','\0','c'};
I = A.strlen();//I为2,因为它遇到‘\0’就结束了。
char *str="abcde"; 
i=strlen(str);           //i为5 
cout<<i<<endl; 
(2)字符指针
char C[]={"abcdef"};
char *p1=C;
i=strlen(p1); //结果为6
cout<<i<<endl;

⚠️注意:

char B[]={'a','f','g','h'};
i = B.strlen();//这时候是会报错的,因为B没有指定内存分配大小。

char D[5]={'a','c','q','f','w'};//这样再用strlen求其长度也会造成错误,当D[]之中的数大于5才不会造成错误。
cout<<i<<endl;

可以这么理解,strlen()这个计数器一直没有遇到它生命当中的那个人'\0',并且上帝也没有给它一个进度条,所以它对于这样的生活是无比绝望的。

(3)其他类型
class X 
  { 
  int i; 
  int j; 
  char k; 
  }; 
  X x; 
cout<<sizeof(X)<<endl; //结果 12 ===>内存补齐 
cout<<sizeof(x)<<endl; //结果 12 同上 
class X 
  { 
  static int i; 
  int j; 
  char k; 
  }; 
  X x; 
cout<<sizeof(X)<<endl; //结果 8 ===>static这一静态变量是存放着全局数据区的,而sizeof 计算的是栈中分配的大小
(4)空类
class A
{};
class A2
{};
class B:public A
{};
class C:public virture B
{};
class D:public A,public A2
{};
int main()
{
cout<<"sizeof(A): "<<sizoef(A)<<endl;
cout<<"sizeof(B): "<<sizeof(B)<<endl;
cout<<"sizeof(C): "<<sizeof(C)<<endl;
cout<<"sizeof(D): "<<sizeof(D)<<endl;
return 0;
}

结果:1 1 4 1
表明空类所占空间为1个字节,单一继承的空类空间也为1,多重继承的空类空间还是1,但虚继承涉及虚表(虚指针),所以sizeof(C)为 4。

3、sizeof()和strlen()的区别

sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。

4、c++当中字符串string的长度

string str1=”cbdsj”; 
int i=str1.length(); 
cout<<”i=str1.length()= ”<<i<<endl; //结果为5
I=str1.size(); 
cout<<”str1.size()= ”<<i<<endl;  //结果为5

总的来说:对于c++中的size()和lengt()没有区别。
⚠️注意:

#include <iostream>
#include <string>
using namespace std;  
int main()
{
    string str("how soft works行");
    cout << "Length of str : " << str.length();
    return 0;
}

大家可以把这段程序自己编译运行一下,可能会得到不同的结果。
我的结果是:17,但是有些人的结果是16。这个的原因是因为字符串里出现了中文。和开发环境有关系了,UTF8是3个字节一个汉字的,那么就是17,ANSI就是16。

总结一下:

  • sizeof()是运算符,其他三个都是函数,其中size()和length()是C++string里面涉及到的函数,在STL当中会经常使用到。
  • strlen()遇到‘\0’,才会停止计数
最后,很感激这篇文章的作者,把这四个“长度”讲得那么清晰明了

http://blog.sina.com.cn/s/blog_67d069a90100ui4p.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • 一、(一共三十题) 1.main() { int a[5]={1,2,3,4,5}; int *ptr=(int ...
    iOS_Alex阅读 963评论 0 0
  • 一、框架 1、Mac系统及常用工具、进制;C数据类型、常量变量、运算符、表达式、格式化输入输出 2、关系运算符、逻...
    师景福阅读 685评论 0 1
  • 一、(一共三十题) 1.main() { int a[5]={1,2,3,4,5}; int *ptr=(int ...
    iOS_Alex阅读 735评论 0 2
  • 一、 C/C++程序基础 面试例题1——分析代码写输出(一般赋值语句的概念和方法)。 面试例题2—...
    LuckTime阅读 1,970评论 2 42
  • 好可惜,我是一条虫子 从出生开始,就赤身裸体 我见惯人类的惊呼和哀怨 当然,总会有一些胆大妄为者 用脚踩烂我的身体...
    娃哈哈乌拉拉阅读 60评论 1 0