10 结构类型

来源:互联网 发布:mysqldump 备份数据库 编辑:程序博客网 时间:2024/06/07 18:19

10 结构类型


1 枚举

  • 常量符号化:提高程序可读性
enum color{red, yellow, green};
  • 枚举是用户定义的数据类型,关键字enum。但是不好用!枚举类型名字并不真的使用,要用的是大括号里的名字,通常是常量符号,类型是int,值一次从0到n。
  • 作为函数参数时需要:void f(enum color c);
  • 离散:enum color{red = 1, yellow, green = 5};
  • 枚举比宏(macro)好,因为枚举有int类型

2 结构类型

  • 结构是复合的数据类型,通常声明在函数外部。
struct date{    int month;    int day;    int year;};    struct{    int x;    int y;} p1, p2;     //没有名字的结构struct point{    int x;    int y;} p1, p2; //初始化,没有初始化默认为0struct date today = {07, 31, 2014};struct date thismonth = {.month = 7, .year = 2014}; 
  • 结构成员:可以是不同类型,用’.’来访问成员
  • 结构运算:数组无法做
p1 = (struct point){5, 10}; //相当于p1.x = 5, p1.y = 10p1 = p2;  //相当于p1.x = p2.x, p1.y = p2.y,并且此时修改p1, p2不会变
  • 结构指针:和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符
struct date *pDate = &today;

3 结构与函数

  • 整个结构可以作为参数的值传入函数
  • 在函数内部新建一个结构变量,并复制调用者的结构的值
  • 也可以返回一个结构
int numberOfDays(struct date d);
  • 输入结构:把结构传入函数然后在函数中操作,但是并没有返回回去。问题在于传入函数的是外面那个结构的克隆体,而不是指针。可以通过创建一个临时的结构变量,然后把这个结构返回给调用者。
  • 结构指针作为参数
  • 指向结构的指针:
struct date{    int month;    int day;    int year;}myday;struct date *p = &myday;(*p).month = 12;p -> month = 12;   //用->表示指针所指的结构变量中的成员

4 结构中的结构

  • 结构数组:
struct date dates[2];struct date dates[] = {    {11,59,59}, {12,0,0}};
  • 结构中的结构:
struct dateAndTime{    struct date sdate;    struct time stime;}
  • 如果定义struct rectangle r, *rp; rp = &r; 那么一下四种形式等价:

    • r.pt1.x
    • rp->pt1.x
    • (r.pt1).x
    • (rp->pt1).x
  • 结构中的结构的数组:


5 类型定义

  • 自定义数据类型:typedef,改善了程序的可读性
typedef int Length; //使Length成为int类型的别名Length a, b;typedef struct ADate{    int month;    int day;    int year;} Date;Date d = {9, 1, 2005};

6 联合

  • sizeof(union) = sizeof(每个成员)的最大值

“`c
union AnElt{
int i;
char c;
}elt1, elt2;
““

  • 存储:
    • 所有成员共享一个空间
    • 同一时间只有一个成员有效
    • union的大小是其最大的成员
  • 初始化:
    • 对第一个成员初始化
0 0