美文网首页C++C++
数组以及字符串的sizeof(),strlen(),以及stri

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

作者: 爱秋刀鱼的猫 | 来源:发表于2017-11-08 09:02 被阅读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。

    总结一下:

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

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

    相关文章

      网友评论

        本文标题:数组以及字符串的sizeof(),strlen(),以及stri

        本文链接:https://www.haomeiwen.com/subject/rsdsmxtx.html