sizeof 和 strlen 的区别和联系

    1. sizeof(…)是 运算符,在头文件中 typedef 为 unsigned int,其值 在编译时 即计算好了, 参数可以是 数组、指针、类型、对象、函数等。
    
    功能:获得 保证能容纳实现所建立的最大对象的字节的 大小
    
    具体而言,当参数分别如下时,sizeof返回的值表示的含义:
    数组——编译时分配的数组空间大小;
    指针——存储该指针所用的空间大小;
    类型——该类型所占的空间大小;
    对象——该对象实际占用空间的大小;
    函数——函数的返回类型所占的空间大小,函数的返回类型不能为 void;
    char *str1="absde";
    char str2[]="absde";
    char str3[8]={'a',};
    char ss[] = "0123456789";
    输出:
    sizeof(str1)=4
    sizeof(str2)=6;
    sizeof(str3)=8;
    sizeof(ss)=11
    
    2. strlen(…)是函数,在 运行时 计算大小, 参数必须是字符型指针(char*),当数组名作为参数传入时,其实已经退化成指针。

        功能:返回字符串的长度
                 该字符串可以是自己定义的,可以是内存中随机的。该函数实际完成的功能是 从代                  
          表该字符串的第一个地址开始遍历,直到遇到结束符NULL,但是 返回的长度大小不包括      
          NULL。

    char * parr = new char[10];
                  int len_one = strlen(parr);
                  int len_two = sizeof(parr);
                  int len_three = sizeof(*parr);
                  cout << len_one << " and " << len_two << " and " << len_three << endl;
        输出结果:23(随机) and 4 and 1
    
    
     3. sizeof 和 strlen 的区别与联系
    (1)sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型
    (2)sizeof是运算符;strlen是函数
    (3)sizeof可以用类型做参数;strlen只能用char*做参数,且必须是以''\0''结尾的,返回的长度大小不包括“\0”。
    (4)数组做sizeof的参数不退化,传递给strlen就退化为指针了。
    (5)大部分编译程序 在编译的时候 就把sizeof 计算过了,是类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因;strlen的结果要在运行时才能计算出来,用来计算字符串的长度,不是类型占内存的大小。
    (6)sizeof 后如果是类型 加 括弧,如果是变量名则可以不加,这是因为sizeof是个操作符不是函数。
    (7)当试用于 一个结构类型时或变量,sizeof返回实际大小;
            当试用于 一个静态的数组时,返回全部数组的尺寸
    
            char* ss = "0123456789";
            sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是
                                                    长整型的,所以是4
            sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类
                                                    型的,占了 1 位
            strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen


猜你喜欢

转载自blog.csdn.net/qq_38131333/article/details/79994972