zoukankan      html  css  js  c++  java
  • sizeof and strlen整理

    sizeof

    • 定义
      • 计算对象类型所占用的字节数(byte)
        • 记住是字节数,而不是个数
    • 语法
      • sizeof(对象)
        • int i; sizeof(i);
      • sizeof(类型)
        • sizeof(int);
      • sizeof 对象
        • int i; sizeof i;
      • sizeof(2);sizeof(2+3.14);
        • sizeof()可以对一个表达式求值,但是它是根据表达式的类型进行求值。
        • 相当于sizeof(int);sizeof(double);
      • sizeof(function())
        • sizeof()可以对一个函数调用求值,其结果是函数返回类型的大小,记住函数是不会被调用的。
        • int function(); sizeof(function());//4
        • 返回值类型是没有确定的函数,不能调用sizeof;
        • void function(); sizeof(function());//error
        • void function(); sizeof(function); //error
    • sizeof的常量性
      • sizeof的计算发生在编译时刻
    • 基本数据类型的sizeof
      • 32位和64位机器的最大区别
        • 32位机器:指针代表寻址空间, 32位的寻址空间是2^32, 即32个bit,也就是4个字节
        • 64位机器,很显然就是8个字节
        • 所以sizeof(指针),32位得4bytes,64位得8bytes,但是其他的基本数据类型是一致的,如sizeof(int)都是4个字节。
    • 数组的sizeof
      • 静态分配的数组
      • 动态分配的数组
        • 很显然,动态分配的数组在编译时是无法知道数组的大小
          • n待输入;int* a=new int[n];sizeof(a); //4
          • 所以对于动态分配的数组sizeof将转换为对指针的sizeof
    • 指针--该指针指向字符数组
      • char *a = "12345"; sizeof(a); //4
      • 上述和char b[] = "12345"还是有区别的,sizeof(b) //6
    • 结构体的sizeof
      • sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和!
        • 结构体的大小等于结构体内最大成员大小整数倍
        • 结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍
        • 为了满足规则1和2编译器会在结构体成员之后进行字节填充

    struct A{

             int num1;

             int num2;

             double num3;

    };

    sizeof(A)//16

    struct B{

             int num1;

             double num3;

             int num2;

    };

    sizeof(B) //24
     
    strlen
    • 定义
      • 返回字符串的长度。
        • 从字符串的第一个字符开始遍历,直到遇到结束符NULL。返回的长度不包括NULL。
      • 运行时计算长度,这个sizeof刚好相反
        • 静态字符数组
          • char a[] = "123";strlen(a);//3,遇到NULL停止,不包括NULL
          • char a[] = "";strlen(a);//0,不包括NULL
          • char a[20] = "123";strlen(a);//3
          • char* a= "123";strlen(a);//3
        • 动态字符数组
          • char *a = new char[20];strlen(a);//27
          • 上述并不知道NULL的结尾,所以得到的长度每次运行都不一样。
  • 相关阅读:
    在Centos 7下编译openwrt+njit-client
    开博随笔
    Chapter 6. Statements
    Chapter 4. Arrays and Pointers
    Chapter 3. Library Types
    Chapter 2.  Variables and Basic Types
    关于stm32不常用的中断,如何添加, 比如timer10 timer11等
    keil 报错 expected an identifier
    案例分析 串口的地不要接到电源上 会烧掉
    案例分析 CAN OPEN 调试记录 进度
  • 原文地址:https://www.cnblogs.com/GODYCA/p/3363198.html
Copyright © 2011-2022 走看看