学科分类
目录
C语言

访问嵌套结构体变量成员

结构体嵌套使用时,访问内部结构体变量的成员时,先通过外层结构体变量访问内部结构体变量,然后再通过内部结构体变量访问成员,即访问内部结构体变量的成员需要使用两次“.”运算符。下面通过一个案例演示如何访问嵌套结构体中的成员,如例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
点击此处
隐藏目录