任意一个可以在结构外部声明的变量都可以作为结构的成员. 包括数组, 指针, 其他结构等. 对于结构成员的访问可以使用 点操作符(.) 和 箭头操作符(->) 完成. 本文举例介绍复杂结构体成员的访问. 结构体声明如下:
// 创建新的结构类型Tag
typedef struct
{
int num;
short date[3];
} Tag;
// 创建新的结构类型Msg时增加了结构名MSG
typedef struct MSG
{
int num; // 标量成员
char name[3]; // 数组成员
Tag tag; // 结构成员
struct MSG *ptr; // 指向结构自身的指针成员
} Msg;
// 定义Msg类型的结构体
Msg msg;
// 定义指向msg对象的指针
Msg *ptr_msg = &msg;
msg结构可以用下图表示:
*ptr_msg
右值结果是整个msg结构体, 左值结果是ptr_msg指向的内存空间.ptr_msg->num = msg.num
访问成员num.&ptr_msg->num
指向成员num的指针, 注意->
的优先级大于&
.ptr_msg->name[1]
访问数组name的第二个元素.ptr_msg->tag
右值结果是tag结构体, 左值是结构体tag的内存空间.ptr_msg0>tag.num
访问tag结构的num成员(不与msg的num成员冲突).*ptr_msg->tag.date
访问date数组的第一个元素. 首先执行ptr_msg->tag
得到tag结构体, 然后执行tag.date
得到常量指针, 最后解引指针得到date的第一个元素.ptr_msg->ptr->num
访问另一个Msg结构体的num成员.ptr_msg->ptr->tag.num
访问另一个Msg结构体中tag结构的num成员.