内容正文:
第10章自定义数据类型
第10章自定义数据类型
定义结构型
结构型指针变量
链表
联合型
枚举型
为类型定义别名
结构型指针变量
这节课我们讨论结构型指针变量。
3
10.1.2 结构型指针变量
语句struct student *pstu;定义了一个指向结构型struct student的指针变量pstu。
指针变量pstu的用法同样是先赋值,让其指向某结构型存储单元,然后以间接引用的方式使用其指向的存储单元。
语句pstu = &stu1;使得指针变量pstu指向了结构型变量stu1,于是,stu1标识的结构型存储单元也可用*pstu的方式使用。
语句struct student *pstu;定义了一个指向结构型struct student的指针变量pstu。
指针变量pstu的用法同样是先赋值,让其指向某结构型存储单元,然后以间接引用的方式使用其指向的存储单元。
语句pstu = &stu1;使得指针变量pstu指向了结构型变量stu1,于是,stu1标识的结构型存储单元也可用*pstu的方式使用。
4
指向成员操作符
struct student *pstu, stu; pstu = &stu;
(*pstu).no = 1;。
(*pstu).no = 1中的括号不能省略,*pstu.no的求值顺序为(*(pstu.no))。
(*pstu).no可简写为:pstu->no,其中->是指向成员操作符,用于结构型指针变量,优先级第一,左结合。
表达式pstu->no可理解为结构型指针变量pstu指向的结构型存储单元中的名为no的成员变量,一个int型存储单元。
struct student *pstu, stu; pstu = &stu; (*pstu).no = 1;。指针变量pstu指向的结构型存储单元中名为no的整型成员变量赋值为1.
(*pstu).no = 1中的括号不能省略,*pstu.no的求值顺序为(*(pstu.no)),其中的pstu应为结构型变量。
(*pstu).no可简写为:pstu->no,其中->是指向成员操作符,用于结构型指针变量,优先级第一,左结合。
结构型指针变量可使用指向成员操作符方便地使用其指向的结构型存储单元中的成员变量。
表达式pstu->no可理解为结构型指针变量pstu指向的结构型存储单元中的名为no的成员变量,一个int型存储单元。
5
对比两个输出函数的形参类型
结构型作形参时,形参的存储单元较大,浪费空间,而且实参给形参赋值时需拷贝大量数据,浪费时间。
通常用结构型指针代替,只有4个字节,既节省空间,又节省时间。
const struct student *pstu中pstu是常引用指针,即其指向的存储单元只能读取,不能修改。
6
例10-2 复数及其运算
定义了一个结构型复数,又定义关于复数的一些操作函数,由复数的实部和虚部得到复数,复数的加减乘除。
7
例10-2 复数及其运算
复数的输出。
8
例10-2 复数及其运算
结构型复数及其操作函数的使用。
9
思考题
优先级第一的操作符有哪些?这些操作符有什么特点?
小括号操作符( )、下标操作符[ ]、成员操作符.和指向成员操作符->。
小括号操作符用于让低优先级的操作符先执行;
下标操作符[ ]、成员操作符.和指向成员操作符->都用于定位“集合”变量中的普通变量,优先级第一方便以更简洁的方式写表达式。
++a[2]; ++(a[2]);。
优先级第一的操作符有哪些?这些操作符有什么特点?
小括号操作符( )、下标操作符[ ]、成员操作符.和指向成员操作符->。
小括号操作符用于让低优先级的操作符先执行;
下标操作符[ ]、成员操作符.和指向成员操作符->都用于定位“集合”变量中的普通变量,优先级第一方便以更简洁的方式写表达式。
++a[2]; ++(a[2]);。
10
链表
这节课我们讨论链表。
11
10.1.3 链表
分析下面定义的结构型:
struct node
{
int data;
struct node *next;
};
struct node结构型的一个成员是指向struct node结构型的指针类型。
定义了一个struct node结构型,特殊之处是其一个成员是指向struct node结构型的指针类型。
由于无论何种类型的指针变量的长度都是固定的4个字节,因此,这个struct node结构型的
存储单元由两部分组成,一部分是4个字节的int型成员data,一部分是4个字节的struct node型指针成员next。
如图所示。
12
分析下面的语句
struct node *head, node1, node2;
定义了三个变量:一个结构型指针变量,两个结构型变量