zoukankan      html  css  js  c++  java
  • sizeof/strlen/length

    1.sizeof()

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

    2.strlen()

      strlen(...)是函数要在运行时才能计算。参数必须是字符型指针(char*),且必须是以''''结尾的。当数组名作为参数传入时,实际上数组就退化成指针了
      它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符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被字符串赋值后只包含字符串本身,不包括''
        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
    ", s.length());              // s.length()  = 5
        printf("sizeof(ch1) = %d
    ", sizeof(ch1));            // sizeof(ch1) = 6
        printf("sizeof(ch2) = %d
    
    ", sizeof(ch2));          // sizeof(ch2) = 5
    
    
        /*----------------------------- 以上区别字符串和字符数组 -----------------------------------
          ------------------------------------------------------------------------------------------*/
    
    
        string str[5] = {"I", "am", "fine", "thank", "you"};
    
        printf("sizeof(char) = %d
    ", sizeof(char));              // 1
        printf("sizeof(string) = %d
    
    ", sizeof(string));        // 4
    
        printf("sizeof(ch2) = %d
    ", sizeof(ch2));                // 5   ----> 数组名不会退化为指针
        printf("sizeof(str) = %d
    
    ", sizeof(str));              // 20  ----> 数组名不会退化为指针
    
        printf("sizeof(ch2[0] = %d
    ", sizeof(*ch2));             // 1
        printf("sizeof(str[0]) = %d
    
    ", sizeof(*str));          // 4   ----> 指针所指向字符所占用空间
    
    
        /*----------------------------- 以上string[]和char[]共同点 ---------------------------------
          ------------------------------------------------------------------------------------------*/
    
        char *ch4 = "0123456789";
        char ch3[20] = "0123456789";
    
        printf("sizeof(ch4) = %d
    ", sizeof(ch4));          // sizeof(ch4) = 4  ----> 计算的是指针所占空间
        printf("sizeof(ch3) = %d
    ", sizeof(ch3));          // sizeof(ch3) = 20 ----> 数组名不会退化为指针
        printf("strlen(ch3) = %d
    
    ", strlen(ch3));        // strlen(ch3) = 10 ----> 数组名退化为指针
    
        printf("strlen(ch1) = %d
    ", strlen(ch1));          // strlen(ch1) = 5  ----> 定值,ch1以''结尾
        printf("strlen(ch2) = %d
    
    ", strlen(ch2));        // strlen(ch2) = 10 ----> 不定值,ch2没以''结尾
    
    
        /*----------------------------- 以上sizeof, strlen使用特点 ---------------------------------
          ------------------------------------------------------------------------------------------*/
    
        string ss = "你好世界";
        printf("ss.size() = %d
    ", ss.size());                // ss.size()   = 8
        printf("ss.length() = %d
    ", ss.length());            // ss.length() = 8
    
        /*----------------------------- 以上C++中string类求长度方法 ---------------------------------
          ------------------------------------------------------------------------------------------*/
        return 0;
    }
  • 相关阅读:
    Android Studio 的 10 个你非常有可能不知道的技巧
    SSH框架的基本整合
    Spring Boot 配置类1-配置类流程
    Spring Boot web容器启动
    Tomcat介绍
    微服务演进史
    SpringBoot异常报告器
    SpringBoot Profile源码介绍
    SpringBoot Environment使用
    Spring Aware原理
  • 原文地址:https://www.cnblogs.com/1203ljh/p/4731434.html
Copyright © 2011-2022 走看看