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 }