13.7 结构体、共用体和用户定义类型
考点18 结构体变量的定义与表示方法
1.结构体的声明
struct 结构体名
{
类型标识符 成员名;
类型表示符 成员名;
…
}
2.结构体变量的声明
(1)可以直接跟在结构体声明之后,例如:
struct{
…
}Array[10];
(2)先声明结构体类型,再单独定义,例如:
stvuctstudent{
…
};
stvuctstudentArray[10];
(3)先声明一个结构体类型名,再用新类型名来定义变量,例如:
typedefstruct{
…
}ST
STArrny[10];
3.结构体变量的引用
格式:结构体变量名.成员名
可以将一个结构体的变量直接赋值给另外一个结构体变量,结构体嵌套时逐级引用。
题型剖析:考点主要是结构体的定义和结构体变量的几种声明形式。主要在填空题中考查,比如根据上下文,补全结构体中的成员等。
考点19 链表
1.指针指向结构体的引用方法
例如,struct*p=a;则下面3种引用成员的方式是一致的:
a.b;
(*p).b;
p->b;
2.链表的组成
(1)头指针,存放第一个数据节点的地址;(2)节点,包括数据域和指针域。
链表的结构可以用图13.1表示:
图13.1 链表的结构
3.链表的操作
链表是一种重要的数据结构,可以动态进行数据的存储分配。对链表的操作包括链表的建立,链表节点的插入和删除等。
(1)插入节点:例如,若要在节点a,b之间插入c,则需要将指针指向a,然后将c->next=a->next;a->next=c;,便得到a->c->b;
(2)删除节点:例如,若在a、c、b三个连续节点中删除c,则将指针指向a后,再将a->next=c->next。
总之,链表操作的原责是,保证操作顺利完成而且不致指针丢失。
题型剖析:
(1)考查单个链表元素的时候,相当于同时考查结构体和指针:
①结构体指针的定义,要注意先赋值再使用。
②考查结构体内的成员用指针的引用同直接用结构体变量名引用形式上的区别,结构体变量的指针及结构体变量指针引用结构体成员赋值,尤其要注意字符数组的赋值。
(2)链表多考查于填空题和改错题,主要是对链表的操作,往往还连带着前后元素的链接关系,所以需要特别注意指针指向的调整以及先后顺序。
考点20 命名类型
格式:typedef定义体 新名称
例如:typedef int INT
之后便可以使用INT来定义一个int型的变量,如INTa=0与inta=0等价。
题型剖析:该知识一般在填空题中考查,只要理解了别名和原定义体实际上是同一个类型即可。
考点21 宏定义
1.不带参数的宏定义
格式:#define 宏名替换文本
例如:#define R 13
#define PI 3.14
2.带参数的宏定义
格式:#define 宏名(参数列表) 字符串
例如:#define MV(x,y) ((x)*(y))
题型剖析:不带参数的宏替换比较简单,只需要将宏名替换相应的常量即可。进行带参数的宏替换时要注意,程序不会将预定义字符串的运算结果进行替换,而是简单的字符替换,例如,#defineMV(x,y)x*y与#defineMV(x,y)(x)*(y)是不同的,当程序引用MV(a+3,5)时,该表达式被分别替换为:MV(a+3*5)和MV((a+3)*5)。