【C语言】03枚举、结构、联合

1. 枚举
  • 前言:常量符号化(可读性更强)
    • 符号不是具体的数字来表示程序中的数字
  • 定义:enum 枚举类型名字{名字0,名字1,…名字n};
    • 枚举类型名字:不常用
    • 大括号里的名字:常量符号 类型int 默认值从0依次到n
    • 实际内部计算:以整数来做内部计算和外部输入输出的
  • 作用:自动计数的枚举量(定义枚举类型时最后一个枚举量用作计数
    • 方便遍历所有的枚举量
    • 建立一个用枚举量下标的数组
  • 注意
    • 声明枚举量的时候可以指定值(没有定义的值在前一个值基础上加一
      • enum COLOR { RED=1, YELLOW, GREEN = 5};//值可以是离散的,可以是自定义的
2. 结构(复合数据类型)
2.1结构类型
  • 结构类型的声明

    struct 结构名{
        类型名 成员变量1;
    	类型名 成员变量2;
        类型名 成员变量3;
        ... ..........;
    };//分号切记不能漏
    
  • 结构变量的定义

    • 定义结构同时定义结构变量
    • 声明结构,定义结构变量
    • 定义无名结构的同时定义结构变量(不常用)
    struct point{ //方法1
        int x;
        int y;
    }p1,p2;//定义结构的同时定义结构变量
    
    struct point{ //方法2
        int x;
        int y;
    };
    struct point p1,p2;//先声明结构后定义结构变量
    
    struct { //方法3 不常用
        int x;
        int y;
    }p1,p2;//定义无名结构的同时定义结构变量
    

注意:通常结构定义在函数外部,与函数同等地位,不依赖于任何的函数

  • 结构的初始化
struct T 结构变量名 = {成员变量1的值,成员变量2的值,...,成员变量n的值};//一一对应赋值
struct T 结构变量名 = {.成员变量1=,.成员变量2=,...,.成员变量3=};//可以缺省某个成员变量的值,缺省值默认为0
  • 结构运算

    • 强制类型转换成某个结构类型再复制给结构变量
  • 结构指针

    • p->month 等价于 (*p).month

    用**->表示指针所指的结构变量**中的成员

  • 注意

    • 结构变量名并不代表结构变量的地址,必须使用&运算符才能获取结构变量的地址
2.2结构与函数
  • 结构作为函数的参数 (传值

    • 整个结构作为参数的值传入函数
    • 在函数内新建一个结构变量,并复制调用者的结构的值

    P.S:数组类型作参数时,传进去的是数组变量地址

  • 输入结构(如何利用一个函数输入结构变量的值?)

    • 方案1(临时结构变量)
      • 在输入函数中定义一个临时的结构变量
      • 把整个临时的结构变量的值返回给调用者
    struct point inputPoint()
    {
        struct point temp;//定义一个临时结构变量
        scanf("%d",&temp.x);
        scanf("%d",&temp.y);
    	return temp;    
    }
    void main( )
    {
    	struct point y = {0, 0};
    	y = inputPoint( );
    }
    
    • 方案2(结构指针)——重要
      • 在输入函数中定义一个临时的结构变量
      • 把整个临时的结构变量的值返回给调用者
    struct point{
    	int x;
    	int y;	
    };
    struct point* inputPoint(struct point *p)
    {
        scanf("%d",&(p->x));//取出p所指的结构变量中成员的地址
        scanf("%d",&p->y);//由于->运算优先级高于&,所以该写法与上等价
    	return p; //返回传入的指针可后续链接其他操作  
    }
    void printpoint(const struct point *p){
        printf("%d,%d",p->x,p->y);
    }
    int main()
    {
    	struct point y = {0, 0};
        printpoint(inputPoint(&y));//赋值的同时可以同时输出结果    
        return 0;
    }
    
方案优点缺点
方案1简单易懂占用大量的内存空间
方案2(重点掌握)传入传出只是一个指针的大小需理解指针
2.3结构中的结构
  • 嵌套的结构(注意下面四种等价形式)

注意:p->成员变量的p必须是指针,否则不行(具体如下)

struct pt {
int x;
int y;
};

struct rectangle {
	struct point pt1;
	struct point pt2;
};

struct rectangle r, *rp;
rp = &r;

那么下面的四种形式是等价的:
r.pt1.x
rp->pt1.x //rp指向的结构变量(rp)的成员变量
(r.pt1).x //点运算符自左往右,有无括号意义相同
(rp->pt1).x
但是没有rp->pt1->x (因为pt1不是指针)//注意
3. 联合
3.1自定义数据类型 Typedef
  • typedef orgin_type rename_type
  • 声明一个已有的数据类型新名字
	typedef long int64_t;
	typedef struct ADate {
			int month;
			int day;
			int year;
	} Date;//将struct AData重载名字为 Datatypedef struct AData Data;
    
	int64_t i = 100000000000;
	Date d = {9, 1, 2005};
3.2联合
  • 联合类型的定义(与结构类型类似)
  • 联合类型的赋值(与结构类型类似)
union AnElt {
	int i;
	char c;
} elt1, elt2;
elt1.i = 4;
elt2.c = ’a’;
elt2.i = 0xDEADBEEF;

注意:

  • 存储

    • 所有成员共占一个存储空间

    • 同一时间只有一个成员有效

    • union的大小是其最大的成员

      sizeof(union …) = max{sizeof(成员1),sizeof(成员2),…,sizeof(成员n)}

  • 初始化(易混淆——与结构类型不同

    • 对第一个成员做初始化(非一一赋值
  • 作用

    • 可利用union对整数(int/float)内部字节进行操作
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值