zoukankan      html  css  js  c++  java
  • 12月14号 宏定义、枚举和动态分配内存

    一、宏定义

    1)什么是宏定义?

    用一个字符串代替一个数据

    2)为什么要用宏定义?

    1.为了让一些数据有意义

    #define kAPPSecret aafjall221adfaf

    #define kAPPKey 124242

    2.类似于内敛函数的意思

    #define kAdd(a, b) ((a)+(b))

    #define kmultiple(a, b) ((a)*(b))

    3.可以做输出日志的开关

    #if 1

    #define Debug(x) printf("%s ", x)

    #else

    #define Debug(x)

    #endif

    int main(int argc, const char * argv[]) {

        Debug("in development");

        return 0;

    }

     

    二、枚举

    *宏定义和枚举的区别

    宏定义是一个值/表达式   不是一种类型

    枚举是一种类型,可以定义枚举类型的一个变量

     

    //定义了一个枚举,类型名字是 kAnimalCategory

    typedef enum{

        kAnimalCategoryBuru = 2,//默认从0开始

        kAnimalCategoryMaoke = 5,//3 后者会在前者之上 + 1

        kAnimalCategoryFeiqin = 7,//4

        kAnimalCategoryZoushou//5

    } kAnimalCategory;

     

    typedef struct{

        char *name;

        kAnimalCategory type; //动物的类别 1 2 3 4

    }Animal;

     

    int main(int argc, const char * argv[]) {

        

        Animal dog;

        dog.name = "xiaohuang";

        dog.type = kAnimalCategoryZoushou;

        return 0;

    }

     

    三、动态分配内存

    1)区分

    1.自动分配内存:当定义以基本类型的变量的时候,系统会为这个变量自动分配内存,这个内存在堆上。当作用域结束,系统会自动将这个内存回收。

    2.动态分配内存:开发人员自己想系统申请的内存空间,申请的内存位于栈上,当作用域结束之后,系统是不会自动收回内存的。这个内存必须有开发人员自己去释放。如果不释放,就内存泄露了。

    2)什么时候需要动态分配内存

    程序运行过程中,需要保存/记录相应地数据,但是又没有提前准备好内存,那么就需要临时动态分配内存。

    3)使用的函数

    void *malloc(size_t);

    size_t:希望申请的内存空间(单位是字节byte)

    void *:系统一开始不知道你需要存放什么数据,不同的数据需要的内存空间不一样,所以默认就是给一个void *,泛指所有指针类型(char *,int *,struct *),当在使用的时候必须将void *转化为相应的类型。如果没有申请成功,那么返回值为NULL。

    4)释放内存free(void *)

    注意:free里面的参数必须是指针,这个指针指向的内存必须是动态分配的。

     

    四、计算结构体内存空间

    原理:如果结构体内部拥有多种数据类型,那么以占据内存字节数最高的类型对齐

    typedef struct{

      char *name;

      int age;

    }Person;//16个字节

    char * 占据8个字节,int占据4个字节

    所以age变量自动向name对齐。整个占据16个字节

    typedef struct{

        char name;

        int age;

    }Person;//8个字节

     

    typedef struct{

        char name[2];

        int age;

    }Person;//8个字节

     

    typedef struct{

        char name[6];

        int age;

    }Person;//12个字节

  • 相关阅读:
    GOF23设计模式之建造者模式
    GOF23设计模式之工厂模式
    GOF23设计模式之单例模式
    服务端字节流输出图片
    小记常见的会话跟踪技术
    Java生成随机数的三种方式
    因为new Date(),我给IE跪了
    ionic初体验
    cordova开发环境搭建
    gradle环境搭建
  • 原文地址:https://www.cnblogs.com/hmzxwky/p/5045797.html
Copyright © 2011-2022 走看看