zoukankan      html  css  js  c++  java
  • 复杂类型及编译相关

    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

      

  • 相关阅读:
    第一个SpringBoot
    windows 安装 mysql 及部分命令
    别让猴子跳回背上
    windows环境下基于Anaconda安装Tensorflow
    spark
    ubuntu环境下安装chrome
    前言
    模型压缩(4)
    模型压缩(3)
    模型压缩(2)
  • 原文地址:https://www.cnblogs.com/smallqizhang/p/12369767.html
Copyright © 2011-2022 走看看