C++C++

数组以及字符串的sizeof(),strlen(),以及stri

2017-11-08  本文已影响11人  爱秋刀鱼的猫

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。

总结一下:

最后,很感激这篇文章的作者,把这四个“长度”讲得那么清晰明了

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

上一篇下一篇

猜你喜欢

热点阅读