程序分析:用赋值语句给stul的num和namc两个成员赋值,用scanf函数动态地输 入stu1的sex和score成员值,将stul直接赋给su2,使stu2的所有成员的值与stul相同, 最后分别输出stu2的各成员值。 在程序中可以引用结构体类型变量成员的地址,也可以引用结构体类型变量的地址如 &stul,但是不能用scanf、printf直接整体输入输出结构体类型变量的值。例如下面的代 码是错误的: scanf("多c8f",6stul,stu2):/错误的代码 11.2.4结构体变量的初始化 前面我们学习过初始化离散变量和数组,例如 int i=0: f1oatf[1=0,1,2,3,4,5,6,7,8,91: 结构体类型变量的初始化和其他类型变量一样,也可以在定义时进行初始化。而且结 构体变量的初始化形式类似于一维数组初始化的语法,例112。 【例112】结构体类型变量初始化。 程序如下: winclude <stdio.h> struct student int numi char *name char sex: float score stu1=102,"Zhang ping",'',78.5),stu2:/变量stu1进行了初始化 int main() stu2-stuli printf("Number=d\nName=$s\n",stu2.num,stu2.name) printf("Sex=8c\nScore=sf\n",stu2.sex,stu2.score)i return 0; 程序运行结果: Number=102 Name=Zhang ping Sex=M Score=78.500000 程序分析:将stul、stu2定义为同一结构体类型的变量,并对stul作了初始化。在main 函数中,把stul的值整体赋给stu2,然后用printf语句输出stu2各成员的值。 6
6 程序分析:用赋值语句给 stu1 的 num 和 name 两个成员赋值,用 scanf 函数动态地输 入 stu1 的 sex 和 score 成员值,将 stu1 直接赋给 stu2,使 stu2 的所有成员的值与 stu1 相同, 最后分别输出 stu2 的各成员值。 在程序中可以引用结构体类型变量成员的地址,也可以引用结构体类型变量的地址如 &stu1,但是不能用 scanf、printf 直接整体输入输出结构体类型变量的值。例如下面的代 码是错误的: scanf("%c %f",&stu1,&stu2);//错误的代码 11.2.4 结构体变量的初始化 前面我们学习过初始化离散变量和数组,例如: int i=0; float f[]={0,1,2,3,4,5,6,7,8,9}; 结构体类型变量的初始化和其他类型变量一样,也可以在定义时进行初始化。而且结 构体变量的初始化形式类似于一维数组初始化的语法,例 11.2。 【例 11.2】 结构体类型变量初始化。 程序如下: #include <stdio.h> struct student { int num; char *name; char sex; float score; } stu1={102,"Zhang ping",'M',78.5},stu2;//变量 stu1 进行了初始化 int main() { stu2=stu1; printf("Number=%d\nName=%s\n",stu2.num,stu2.name); printf("Sex=%c\nScore=%f\n",stu2.sex,stu2.score); return 0; } 程序运行结果: Number=102 Name=Zhang ping Sex=M Score=78.500000 程序分析:将 stu1、stu2 定义为同一结构体类型的变量,并对 stu1 作了初始化。在 main 函数中,把 stu1 的值整体赋给 stu2,然后用 printf 语句输出 stu2 各成员的值
11.2.5结构体类型数组 再回到前面的111小节中学生成绩管理的例子。现在我们将程序扩展,假设需要编程 输入输出的信息不只是一个学生,而是更多的学生。每一个学生就是一个student类型的变 量,如果是两个学生,则需要定义两个student类型的变量,以此类推。批量数据处理时数 据的表示应该采用数组,C语言也支持结构体类型的数组。 结构体数组是结构体与数组的结合,与普通数组的不同之处在于每个数组都是一个结 构体类型。结构体类型数组的每一个元素是同一结构体类型的变量。在实际应用中,经常 用结构体类型数组表示具有相同数据结构的一个群体,如一个班内每个学生的信息等。 1.结构体类型数组的定义 结构体类型数组的定义方法和结构体类型变量的定义方法相似。 例如: struct int num; char name[30] float score[5]; )stu[5]: 说明:定义了一个结构体类型数组stu,su共有5个元素,stu0~stu4],每个数组 元素都是student结构体类型。 也可以采用先定义结构体类型后定义数组,或直接定义结构体类型数组的形式。参照 结构体变量的定义形式。 2.结构体类型数组的初始化 对结构体类型数组可以作初始化,实际上是对数组元素的最低层成员初始化。其格式 与二维数组的初始化类似。为方便理解问题的实质,我们先简化为只输入一个分数,见下 struct int num char name[30] float score; 1/只有一个分数 }stu[5]■{ /+数组的初始化,后面1个数据初始化3core*/ {101,"ina",45 {102,"Limi1i",1001, 103,"Kun kun",92.51, {104,"Cheng1ing",871 {105,"Wang ming",58} 回
7 11.2.5 结构体类型数组 再回到前面的 11.1 小节中学生成绩管理的例子。现在我们将程序扩展,假设需要编程 输入输出的信息不只是一个学生,而是更多的学生。每一个学生就是一个 student 类型的变 量,如果是两个学生,则需要定义两个 student 类型的变量,以此类推。批量数据处理时数 据的表示应该采用数组,C 语言也支持结构体类型的数组。 结构体数组是结构体与数组的结合,与普通数组的不同之处在于每个数组都是一个结 构体类型。结构体类型数组的每一个元素是同一结构体类型的变量。在实际应用中,经常 用结构体类型数组表示具有相同数据结构的一个群体,如一个班内每个学生的信息等。 1.结构体类型数组的定义 结构体类型数组的定义方法和结构体类型变量的定义方法相似。 例如: struct { int num; char name[30]; float score[5]; }stu[5]; 说明:定义了一个结构体类型数组 stu,stu 共有 5 个元素,stu[0]~stu[4],每个数组 元素都是 student 结构体类型。 也可以采用先定义结构体类型后定义数组,或直接定义结构体类型数组的形式。参照 结构体变量的定义形式。 2.结构体类型数组的初始化 对结构体类型数组可以作初始化,实际上是对数组元素的最低层成员初始化。其格式 与二维数组的初始化类似。为方便理解问题的实质,我们先简化为只输入一个分数,见下 例: struct { int num; char name[30]; float score; //只有一个分数 }stu[5]={ /*数组的初始化,后面 1 个数据初始化 score*/ {101,"Li na",45}, {102,"Li mili",100}, {103,"Kun kun",92.5}, {104,"Cheng ling",87}, {105,"Wang ming",58} };
现在我们将问愿再扩展到同时初始化5个分数,见下例: struct int num; char name30 f1 oat score[51:/需要5门课的分数 )stu[5]=( /*数组的初始化,后面5个数据初始化数组score*/ 101,"1na",45,90,87,67,88, {102,"Limi1i",100,80.5,87,85,84, 103,"K1nkun",92.5,78,67,56,801 104,"Cheng1ing",87,56,78,89,66) {105,"Wang ming",58,34,67,78,771 1 当对全部数组元素作初始化赋值时,也可不给出数组长度,例如: struct int num char name[30] float score[5] )stu[]={ 1/可缺省数组的长度 101,"Lina",45,90,87,67,881 (102,"Limi1i",100,80.5,87,85,84), {103,"Kunkun",92.5,78,67,56,80}, (104,"Cheng1ing",87,56,78,89,66) 105,"Wang ming",58,34,67,78,77 3、结构体类型数组的引用与赋值 由于每个结构体数组元素都是结构类型,其使用方法就和相同类型的结构变量一样, 例如: 【例113】计算5个学生每人的平均成绩。 程序如下: #include <stdio.h> struct int num; char name[30]; float score[5]; )stu[]-( /可缺省数组的长度 101,"1ina",45,90,87,67,88}, 义8
8 现在我们将问题再扩展到同时初始化 5 个分数,见下例: struct { int num; char name[30]; float score[5];//需要 5 门课的分数 }stu[5]={ /*数组的初始化,后面 5 个数据初始化数组 score*/ {101,"Li na",45,90,87,67,88}, {102,"Li mili",100,80.5,87,85,84}, {103,"Kun kun",92.5,78,67,56,80}, {104,"Cheng ling",87,56,78,89,66}, {105,"Wang ming",58,34,67,78,77} }; 当对全部数组元素作初始化赋值时,也可不给出数组长度,例如: struct { int num; char name[30]; float score[5]; }stu[]={ //可缺省数组的长度 {101,"Li na",45,90,87,67,88}, {102,"Li mili",100,80.5,87,85,84}, {103,"Kun kun",92.5,78,67,56,80}, {104,"Cheng ling",87,56,78,89,66}, {105,"Wang ming",58,34,67,78,77} }; 3、结构体类型数组的引用与赋值 由于每个结构体数组元素都是结构类型,其使用方法就和相同类型的结构变量一样, 例如: 【例 11.3】 计算 5 个学生每人的平均成绩。 程序如下: #include <stdio.h> struct { int num; char name[30]; float score[5]; }stu[]={ //可缺省数组的长度 {101,"Li na",45,90,87,67,88}