结构体中含有结构体成员变量

1. 结构体成员变量介绍

在C语言中经常出现结构体作为结构体的成员变量的情况,如链表

1.1 结构体成员变量的形式

结构体作为成员变量有时可能是在其他文件中进行了声明,这里简单的以在同一个文件中表示进行介绍。

  3 struct score
  4 {
  5     float math;
  6     float chinese;
  7     float englise;
  8     float physical;
  9 };
 10 
 11 typedef struct score SCORE;
 12 
 13 struct node
 14 {
 15     SCORE data;
 16     int id;
 17     char* name;
 18 };
 19 
 20 typedef struct node lnode;

如上面的代码所示,在结构体node中score结构体作为成员变量,这种形式有比较清晰的层次关系。

1.2 结构体中含结构体变量的优缺点

优点:从上面的1.1节代码中可以看到,将所有分数相关的成员放入一个结构体中,然后将这个结构体又作为一个成员变量放入另一个结构体中。这中方式可以使得结构层次清晰明朗,同一类的信息放入一个结构体,在使用时比较清晰。
缺点:需要使用某个结构体中的成员变量时需要多级包含

2. 结构体成员变量赋值

2.1直接赋值

直接赋值也有两种方式,一种是直接在定义时就赋值,把结构体当做一个整体进行赋值

lnode ln2 = {{1002,"wujing",78,98},88,NULL};

另一种是先定义里面的结构体,然后将其当做一个成员进行赋值

ST s1 = {1001,"wangj",98,82};
lnode ln1;
ln1.data = s1;
ln1.english = 92;
ln1.next = NULL;

2.2通过指针赋值

通过结构体指针间接的对结构体中每个成员进行赋值,结构体变量做为一个成员变量可以整体赋值,也可以对结构体内部的变量单独赋值。

lnode ln3;
lnode* p = NULL;
p = &ln3;
p->english = 66;
p->data.id = 1003;
p->data.name = "Lihai";
p->data.math = 76;
p->data.chinese = 86;
p->next = NULL;

3. 示例代码

  1 #include <stdio.h>
  2 
  3 struct student
  4 {   
  5     int id;
  6     char* name;
  7     int math;
  8     int chinese;
  9 };
 10 
 11 typedef struct student ST;
 12 
 13 struct node
 14 {   
 15     ST data;
 16     int english; 
 17     struct node* next;
 18 };
 19 
 20 typedef struct node lnode;
 21 
 22 int main()
 23 {
 24     lnode ln2 = {{1002,"wujing",78,98},88,NULL};
 25     printf("ln2.data.id = %d, ln2.data.name = %s, ln2.data.math = %d, ln2.da    ta.chinese = %d, ln2.english = %d, ln2.next = %#lx\n", ln2.data.id, ln2.data    .name, ln2.data.math, ln2.data.chinese, ln2.english, ln2.next);
 26 
 27     ST s1 = {1001,"wangj",98,82};
 28     lnode ln1;
 29     ln1.data = s1;
 30     ln1.english = 92;
 31     ln1.next = NULL;
 32     printf("ln1.data.id = %d, ln1.data.name = %s, ln1.data.math = %d,ln1.dat    a.chinese = %d, ln1.english = %d, ln1.next = %#lx\n", ln1.data.id, ln1.data.    name, ln1.data.math, ln1.data.chinese, ln1.english, ln1.next);
 33 
 34     lnode ln3;
 35     lnode* p = NULL;
 36     p = &ln3;
 37     p->english = 66;
 38     p->data.id = 1003;
 39     p->data.name = "Lihai";
 40     p->data.math = 76;
 41     p->data.chinese = 86;
 42     p->next = NULL;
 43     printf("ln3.data.id = %d, ln3.data.name = %s, ln3.data.math = %d,ln3.dat    a.chinese = %d, ln3.english = %d, ln3.next = %#lx\n", ln3.data.id, ln3.data.    name, ln3.data.math, ln3.data.chinese, ln3.english, ln3.next);
 44 }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值