[CP1511] Typedef/Structs

一、Typedef 定义

To give a name for a type.

typedef double real;    //被命名为real的double格式的结构

typedef int darthVader;

darthVader main(void){
    darthVander i, j;      //大概的格式,但是不要overuse结构体,会造成阅读困难
}

使用这种方式可以一定程度上节约内存

二、Structs 创建方式

//example1

#define MAX_NAME 400     //名字最长字节数
#define N_LABS 10              //lab数量

struct student{
    int zid;
    char name[MAX_NAME];
    double labMarks[N_LABS];
    double assignment1Mark;
    double assignment2Mark;
}
typedef struct student Student;   //Type-define
Student cp1511Students[400];    //建立400个学生档案

三、使用已经建立的 Structs

//exaple_of_structs_use(此时已经建立了struct,这里忽略了创建过程)

int main(void){
    Student s;
    s.zid = 5285978;
    strcpy(s.name, "Some One Else");
    s.labMarks[0] = 1;
    s.assgignment1Mark = 10;
}

s.结构体内项目名称

与arrays不同,我们可以直接用 = 去复制结构体内所有的数据

Student student1,student2;
....
student2 = student1;

但是在作为判断条件的情况下是不能直接将两个结构体之间进行比较的,只能用“component-by-component”这样的方式比较。

另外结构体可以被用作function中的元素:

void printStudent(Student s) {
      printf("%s z%d\n", s.name, s.zid);
}

与arrays不同的是,一个function可以return结构体。

如果我们想要传递一个元素而不是传递整个结构体,以此提升效率:

int scanZid(Studnet *s){
    return scanf("%d", &((*s).zid));
    //或者用以下方式提高可读性
    return scanf("%d", &(s->zid));
}

四、整体使用案例

typedef struct date Date;
typedef struct time Time;
typedef struct parkingTicket ParkingTicket;

struct date {
    int day, month, year;  //建立date结构体
};

struct time {
    int hour, minute;
        //建立time结构体
};

struct parkingTicket {
    Date date;
    Time time;
    char plate[MAX_PLATE];   //生成带车牌的停车票
};