sizeof与strlen

来源:互联网 发布:php 异步执行 队列 编辑:程序博客网 时间:2024/05/14 11:21

1.sizeof

sizeof运算符返回一条表达式或者一个类型名字所占的字节数,注意sizeof不是一个函数,运算对象有两种形式。

sizeof (type)和sizeof expr,第二种返回的是表达式结果类型的大小

sizeof不会实际求运算对象的值,无须为其提供具体对象。

对于以下类型:

引用---得到被引用对象的空间

指针---指针本很空间

解引用指针---所指向空间大小

数组---等价于数组中各执行一次并求和,不会转化为指针来处理

string对象、vector对象---返回该类型固定大小部分

2.strlen

strlen是函数,参数只能是可被转化为const char*的类型,strlen计算是从开始到遇见'\0'的长度,不包含'\0'


3.综合上述两点得出sizeof关注的理是论上给该类型多少,strlen关注的是实际有的是多少

4.对于数组长度 

    char test1[4]={'1','2'};    cout<<sizeof(test1)<<endl;         //输出4    cout<<strlen(test1)<<endl;         //输出2

5.对于两个string对象(sizeof)

    string str1="1234";    string str2="12345678";    cout<<sizeof(str1)<<endl;          //输出4    cout<<sizeof(str2)<<endl;          //输出4

6.对于sizeof与strlen的差异

    int a, b, c, d;    a = sizeof("123456789");           //10    b = sizeof("123456789"+1);         //4    c = strlen("123456789");           //9    d = strlen("123456789"+1);         //8    cout<<a<<" "<<b<<" "<<c<<" "<<d<<endl;

7.差异原因

    char test1[10];    const char* test2="23456789";     //"123456789" ---转换为字符数组 长度10 最后一个 \0    cout<<typeid("123456789").name()<<endl;    cout<<typeid(test1).name()<<endl;    cout<<typeid(test2).name()<<endl;    //输出 23456789 strlen 算出8    cout<<("123456789"+1)<<endl;    //"123456789"+1 的类型为 char const * 长为 4    cout<<typeid("123456789"+1).name()<<endl;    cout<<typeid(test2).name()<<endl;    //输出4    cout<<sizeof(char const *)<<endl;

对于sizeof来说,"123456789"和"123456789"+1体现出很大的差别,对于前者,sizeof将其当成字符数组,计算得出结果10(最后一个'\0'),对于后者则是进行了指针运算,计算的是指针的长度,所以"123456789"+1的类型为const char*,长为4,而“123456789”是char [10]类型,长为10

对于strlen来说"123456789"和"123456789"+1只是算起始点和最后的'\0‘之间的长度,前者为9(不含'\0'),后者为8(指针后移一位)





 


0 0