访问嵌套结构体变量成员
结构体嵌套使用时,访问内部结构体变量的成员时,先通过外层结构体变量访问内部结构体变量,然后再通过内部结构体变量访问成员,即访问内部结构体变量的成员需要使用两次“.”运算符。下面通过一个案例演示如何访问嵌套结构体中的成员,如例1所示。
例1 structNest.c
1 #include <stdio.h>
2 struct Birth //定义结构体类型struct Birth
3 {
4 int year;
5 int month;
6 int day;
7 };
8 struct Person //定义结构体类型struct Person
9 {
10 int ID;
11 char name[10];
12 char sex;
13 struct Birth birthDate; //包含struct Birth结构体变量birthDate
14 };
15 int main()
16 {
17 struct Person p = { 0006,"chenyan",'F',{1980,1,1}};
18 printf("ID:%04d\n", p.ID); //输出成员ID的值
19 printf("name:%s\n", p.name); //输出成员name的值
20 printf("sex:%c\n", p.sex); //输出成员sex的值
21 printf("birth:%d-%d-%d\n", //输出成员birthDate中的各成员值
22 p.birthDate.year,p.birthDate.month,p.birthDate.day);
23 return 0;
24 }
例1运行结果如图1所示。
图1 例1运行结果
在例1中,第2~7行代码定义了struct Birth结构体类型,用于表示个人出生日期;第8~14行代码定义了struct Person结构体类型,在该结构体中包含了struct Birth结构体变量birthDate;第17行代码定义了struct Person结构体变量p,并对其进行初始化;第18~22行代码分别输出变量p的各项成员值,在输出成员birthDate的各项值时,使用p.birthDate访问birthDate的成员。由图1可知,struct Person结构体变量p的所有成员成功输出。
需要注意的是,结构体不能嵌套自身结构体类型的变量,因为嵌套自身结构体类型变量时,结构体类型还未定义,编译器无法确定自身类型的变量需要分配多少内存空间。错误示例代码如下:
struct Person //定义结构体类型struct Person
{
int ID;
char name[10];
char sex;
struct Person p1; //错误,嵌套自身结构体类型的变量
};
上述结构体在编译时,编译器会报错,提示p1使用未定义的struct Person。虽然结构体无法嵌套自身结构体类型的变量,但却可以嵌套自身结构体类型的指针变量,这是因为指针变量的大小只与计算机系统架构有关,编译器可以确定指针变量的大小并为其分配内存空间。示例代码如下:
struct Person //定义结构体类型struct Person
{
int ID;
char name[10];
char sex;
struct Person *ptr; //正确,嵌套自身结构体类型的指针变量
};
在上述代码中,struct Person结构体类型嵌套了struct Person结构体类型的指针变量ptr,定义struct Person结构体类型的变量p1和p2,并对它们进行初始化,示例代码如下:
struct Person p1 = { 0010,"lisi",'M'};
struct Person p2 = { 0007,"wangwu",'F',&p1 }; //取变量p1的地址赋值给ptr
上述代码中,定义了struct Person结构体变量p1与p2,在变量p2中,取变量p1的地址赋值给成员ptr。通过变量p2中的指针ptr可以访问到变量p1中的成员,示例代码如下:
p2.ptr->ID; //访问struct Person结构体变量p1的成员ID
p2.ptr->name; //访问struct Person结构体变量p1的成员name
p2.ptr->sex; //访问struct Person结构体变量p1的成员sex