sizeof/strlen/length

1.sizeof()

  sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
  它的功能是:获得保证能容纳实现所建立的最大对象的字节大小
  由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值对象、结构、数组所存储的内容没有关系
  具体而言,当参数分别如下时,sizeof返回的值表示的含义如下:
  数组——编译时分配的数组空间大小,不退化为指针
  指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,为4);
  类型——该类型所占的空间大小;
  对象——对象的实际占用空间大小;
  函数——函数的返回类型所占的空间大小(函数的返回类型不能是void)。

 

2.strlen()

  strlen(...)是函数要在运行时才能计算。参数必须是字符型指针(char*),且必须是以''\0''结尾的。当数组名作为参数传入时,实际上数组就退化成指针了
  它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL,返回的长度大小不包括NULL

 

3.length()

  length( )和size( )返回字符串中的字节数。length是因为沿用C语言的习惯而保留下来的,string类最初只有length,引入STL之后,为了兼容又加入了size,它是作为STL容器的属性存在的,以便用于STL的算法。string类的size()/length()方法返回的是字节数不管是否有汉字

 

相关测试代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

int main()
{
    string s = "abcde";                       // string被字符串赋值后只包含字符串本身,不包括'\0'
    char ch1[] = "abcde";                     // ch1[5] = "abcde"  -----------------------> ERROR
    char ch2[] = {'a', 'b', 'c', 'd', 'e'};   // ch2[5] = {'a', 'b', 'c', 'd', 'e'}  -----> RIGHT

    printf("s.length() = %d\n", s.length());              // s.length()  = 5
    printf("sizeof(ch1) = %d\n", sizeof(ch1));            // sizeof(ch1) = 6
    printf("sizeof(ch2) = %d\n\n", sizeof(ch2));          // sizeof(ch2) = 5


    /*----------------------------- 以上区别字符串和字符数组 -----------------------------------
      ------------------------------------------------------------------------------------------*/


    string str[5] = {"I", "am", "fine", "thank", "you"};

    printf("sizeof(char) = %d\n", sizeof(char));              // 1
    printf("sizeof(string) = %d\n\n", sizeof(string));        // 4

    printf("sizeof(ch2) = %d\n", sizeof(ch2));                // 5   ----> 数组名不会退化为指针
    printf("sizeof(str) = %d\n\n", sizeof(str));              // 20  ----> 数组名不会退化为指针

    printf("sizeof(ch2[0] = %d\n", sizeof(*ch2));             // 1
    printf("sizeof(str[0]) = %d\n\n", sizeof(*str));          // 4   ----> 指针所指向字符所占用空间


    /*----------------------------- 以上string[]和char[]共同点 ---------------------------------
      ------------------------------------------------------------------------------------------*/

    char *ch4 = "0123456789";
    char ch3[20] = "0123456789";

    printf("sizeof(ch4) = %d\n", sizeof(ch4));          // sizeof(ch4) = 4  ----> 计算的是指针所占空间
    printf("sizeof(ch3) = %d\n", sizeof(ch3));          // sizeof(ch3) = 20 ----> 数组名不会退化为指针
    printf("strlen(ch3) = %d\n\n", strlen(ch3));        // strlen(ch3) = 10 ----> 数组名退化为指针

    printf("strlen(ch1) = %d\n", strlen(ch1));          // strlen(ch1) = 5  ----> 定值,ch1以'\0'结尾
    printf("strlen(ch2) = %d\n\n", strlen(ch2));        // strlen(ch2) = 10 ----> 不定值,ch2没以'\0'结尾


    /*----------------------------- 以上sizeof, strlen使用特点 ---------------------------------
      ------------------------------------------------------------------------------------------*/

    string ss = "你好世界";
    printf("ss.size() = %d\n", ss.size());                // ss.size()   = 8
    printf("ss.length() = %d\n", ss.length());            // ss.length() = 8

    /*----------------------------- 以上C++中string类求长度方法 ---------------------------------
      ------------------------------------------------------------------------------------------*/
    return 0;
}

 

posted on 2015-08-14 22:55  huashunli  阅读(201)  评论(0编辑  收藏  举报

导航