复杂类型及编译相关

1.自定义类型

  typedef:

    语法格式:typedef 声明语句;//声明语句里面的变量就是它那种变量类型的别名。

  typedef 与 #define的区别:

    1)语法格式不同。

    2)#define是一个纯粹的替换,typedef是一个自定义类型,并不是替换。

    3)命名上,#define一般使用大写字符去代表,typedef一般使用小写字符_t去结尾。

    4)typedef能够定义复杂类型,宏定义则不行。

2.结构体:将多种数据类型合并成为一种复合类型,以后用这种类型声明一个变量,那么这个变量就会拥有多个对应的数据类型数据。

  1)格式:struct student{

      int num;

      char name[20];

      ...

      };

  2)结构体的声明方式

    a.跟普通变量的声明一样

    struct student{

      char name[20];

      int num;

      };

    struct student st;

    b.在声明的时候可以同时诞生一个变量出来(常用)

    struct student{

      int num;

      char name[20]'

      }st;

    c.多重结构体,里面的结构体就是匿名结构体

    struct student{

    int num;

    char name[20];

    struct{

      int a;

      char b;

      }tt;

    }

  3)结构体变量的操作方式

    a.通过结构体名字直接访问内部的元素

      格式:结构体变量名.元素名,例如:st.name

    b.通过结构体的地址访问元素

      struct student *sp;//定义一个结构体指针

      sp->num = 100;等价于(*sp).num;

    c.剩余的操作跟其他类型一样

  4)结构体的初始化

    a.类似于数组的赋值方式,将多个数据直接用{}包起来,然后按顺序往里面填内容。

    b.也可以值赋值其中的一个或者多个。

    c.指定某个具体的元素名字进行赋值,后面如果没有指定名字,则按照名字后的顺序赋值(可以若干个,可以乱序)。

  5)结构体的赋值

    跟普通变量一样,直接赋值。

  6)结构体的大小

    结构体在创建的时候,内存对齐。

    计算方法:先找出里面元素最大的大小是多少(32位系统的封顶值是4个字节,64位是8个字节)

        a.按照顺序来分内存。

        b.按照元素最大大小来进行内存对齐申请。

        c.如果剩下的空间不够放下一个元素,那么将会开辟一片新的空间,直接跳过这个不够用的空间。

        d.最后结尾如果还有空的内存,也会并入结构体内存中。

3.共用体/联合体 union

  共用体所有的语法跟结构体一样,例子:

  union test{

     int a;

     char b;

      }

  在函数调用,共用体传入参数的时候,不用选择传入地址类型。

  共用体被用来解决的问题:一种类型,多种用法。

4.枚举常量

  特点:将多种相同类型的数据统一的取别名。

  格式:enmu 枚举名字{

        枚举成员1,枚举成员2...}

  a.在C语言中,枚举类型比较少用到,已经优化成不需要写枚举名字了。

  b.枚举里面的成员的名字以后就是个整型常量。

  c.枚举成员如果没有初始化则按照每个成员值+1的形式赋值,第一个没有初始化则从0开始。

  d.枚举成员是一个常量,所以不能给他赋值。

  e.switch语句中可以使用枚举常量,case xxx。

5.#define  宏定义(一种纯粹的替换)

  格式:#define  名字  内容

  宏函数:#define 函数名(参数列表) ({ 内容; })

  注意:

    a.宏函数的参数列表没有数据类型.

    b.只是个纯粹的替换.

    c.宏函数的返回值就是最后一条表达式的值。

    d.不会开辟新的栈,是指纯粹的替换而已。

  缺点:

    a.宏函数如果一不小心破坏了程序的逻辑,很难找到错误的原因,兼容性差,因此一般不会轻易定义宏函数。

6.预处理语句

  a.以#开头的语句

  b.在gcc编译的第一步就被展开了(被去掉了),不会影响程序的速度。

  注意:

    a.预处理语出只能是一行,不能是多行。

    b.名字一般都是大写的。

    c.如果内容实在太多,我们可以用 来将下一行的内容跟上一行的内容合并。

7.头文件:将对各声明语句放在一起的特殊文件,以.h结尾。

  头文件的内容:

    a.预处理语句

    b.声明语句  函数声明,类型声明

  头文件的导入方式:  

    #include  <头文件.h>  在系统环境中寻找,这种事添加系统自带的头文件

    #include "头文件.h>  现在本地寻找要添加的头文件,如果没有才去系统中找。

  头文件标准书写方式:

    #ifndef 当前头文件的宏  #ifndef _FUNC_HEAD_H

    #define 当前头文件的宏  #define _FUNC_HEAD_H

    头文件的内容

    #endif

8.条件编译语句(常用):选择对应的代码保留下来,剩下的就相当于注释掉。

    #if  1(这里是1的话就执行a语句,是0就执行b语句)

    a;

    #else

    b;

    #endif

    #iindef

    #else

    #endif

  

原文地址:https://www.cnblogs.com/smallqizhang/p/12369767.html