C语言学习9

文章目录
  1. 1. 结构体、枚举和共用体
    1. 1.1. 用typedef说明一种新类型名
    2. 1.2. 结构体数据类型
    3. 1.3. 结构体类型变量的定义
      1. 1.3.1. 先声明结构体类型再定义变量名
      2. 1.3.2. 在声明类型的同时定义变量
      3. 1.3.3. 直接定义结构体类型变量
    4. 1.4. 结构体变量的引用
    5. 1.5. 结构体数组
    6. 1.6. 结构体指针(指向结构体的指针)
      1. 1.6.1. 获取结构体成员
      2. 1.6.2. 指向结构体数组的指针
      3. 1.6.3. 用结构体变量和指向结构体的指针作为函数参数
      4. 1.6.4. 程序示列
    7. 1.7. 枚举类型
    8. 1.8. 共用体

结构体、枚举和共用体

本文将分别讲述C语言中关于结构体、枚举和共用体的相关知识。

用typedef说明一种新类型名

1.一般形式:typedef 类型名 标识符;
其中,”类型名”一定是在此语句之前已有定义的类型标识符。”标识符”是一个用户定义标识符,用来标识新的类型名。
2.typedef语句作用:用”标识符”来代表已存在的”类型名”,并没有产生新的数据类型,因此原有的类型名依然有效。
3.声明一个新的类型名的具体步骤:
①先按定义变量的写法写出定义的主体(如: float a;)
②将变量名换成新类型名(如 将a换为FLO)
③在最左边加上关键字typedef(如 typedef float FLO)
④然后可以用新类型名去定义其他变量 (如: FLO b;)

结构体数据类型

结构体用来存放一组不同类型的数据。
1.一般形式为:

1
2
3
struct 结构体名{
成员列表
};

2.结构体类型说明形式:

1
2
3
4
5
6
struct 结构体标识名{
类型名1 结构体成员名表1
类型名2 结构体成员名表2
...
类型名n 结构体成员名表n;
};

说明:
①”结构体标识名”和”结构体成员名表”都必须是合法的用户定义标识符。
②每一个”结构体成员名表”中都可以含有多个同类型的成员名,它们之间以逗号分隔。
③结构体类型说明中”类型名1”~”类型名n”,不仅可以是简单数据类型,也可以是某种结构体类型。当结构体说明中又包含结构体时,称为结构体的嵌套。
④ANSIC 标准规定结构体至多允许嵌套15层,并且允许内嵌结构体成员名与外层成员名相同。

结构体类型变量的定义

先声明结构体类型再定义变量名

如已定义了一个结构体类型 struct time ,可以如下定义:

1
2
struct time time1,time2;
结构体类型名 结构体变量名;

time1和time2为struct time 类型变量,即它们都具有struct time 类型的结构。

在声明类型的同时定义变量

其一般形式为:

1
2
3
struct 结构体名{
成员列表;
}变量名表列;

直接定义结构体类型变量

一般形式:

1
2
3
struct {
成员表列
}变量名表列;

结构体变量的引用

引用结构体变量时应注意:
●结构体变量不能作为一个整体而对其进行任何操作,只能对结构体变量中的各个成员分别进行输入和输出等操作。结构体变量中的成员用以下方式引用: 结构体变量名.成员名
●如果结构体的某个成员本身又是一个结构体类型,则可以使用若干个成员运算符”.”,一级一级地找到最低的一级成员,只能对最低一级的成员进行赋值或存取运算。
●结构体变量的初始化,是指逐个对结构体变量的各个成员进行初始化的过程。

结构体数组

所谓结构体数组,是指数组中的每一个元素都是一个结构体。在实际应用中,C语言结构体数组常被用来表示一个拥有相同数据结构的群体。
1.一般形式:

1
2
3
struct 结构体变量名{
成员表列
}数组名[常量表达式];

2.结构体数组的初始值应顺序地放在一对花括号中。

结构体指针(指向结构体的指针)

当一个指针变量指向结构体时,我们就称它为结构体指针。
结构体指针定义形式的一般形:
struct 结构体名 *变量名;

获取结构体成员

通过结构体指针可以获取结构体成员,一般形式为:
(*pointer).memberName 或 pointer->memberName

指向结构体数组的指针

结构体数组及其元素也可用指针指向。在使用指针变量指向结构体数组时,只要把该结构体数组中的每个元素当做普通的结构体变量使用即可。

用结构体变量和指向结构体的指针作为函数参数

●将一个结构体变量的成员作为实参传递给主调函数。
●用结构体变量作为一个整体实参
●C语言允许结构体变量的地址作为实参传递,这时对应形参应是一个基类型相同的结构体类型的指针。

▲结构体变量名代表整个集合本身,作为函数参数时传递整个集合,也就是所有成员,而非像数组一样被编译器转换为指针。若成员体较多,则开销大,影响效率。最好的办法是使用结构体指针,由实参向形参传递地址,效率高。

程序示列

计算全班学生的总成绩,平均成绩和以及140分以下的人数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
}stus[]={
{"LiPing",5,18,'C',145.0},
{"ZhangPing",4,19,'A',130.5},
{"HeFang",1,18,'A',148.5},
{"ChengLing",2,17,'F',139.0},
{"WangMing",3,17,'B',144.5}
}

void average(struct stu *ps,int len){
int i,num_140 = 0;
float average,num = 0;
for(i=0;i<len;i++){
sum+=(ps+i)->score;
if((ps+i)->score<140)
num_140++;
}
printf("sum=%.2f\n average=%.2f\n num_140=%d\n",sum,sum/s,num_140);
}

int main(){
int len = sizeof(stus)/sizeof(struct stu);
average(stus,len);
return 0;
}
运行结果:
sum=707.50
average=141.50
num_140=2

枚举类型

C语言提供的枚举(Enum)类型,能够列出一个标识符的所有可能性。
枚举的一般形式为:
enum typeName{valueName1,valueName2,valueName3,…};
如: enum week{Mon,Tues,Wed,Thurs,Fri,Sat,Sun};
说明: 枚举值默认从0开始,往后逐个加1(递增),即Mon、Tues、…Sun对应值分别为0、1…6。
枚举值也可指定 如:
enum week{Mon=1,Tues=2,Wed=3,Thurs=4,Fri=5,Sat=6,Sun=7};
或:
enum week{Mon=1,Tues,Wed,Thurs,Fri,Sat,Sun};

共用体

共用体是一种类似结构体的构造数据类型,也包含了多个成员数据。
它的一般形式为:

1
2
3
union 共用体名{
成员列表
};

说明:
共用体有时也被称为联合或者联合体,这也是Union的本意。
共用体与结构体的区别在于:结构体的各个成员会占用不同的内存,相互之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的总和(成员之间可能会有缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。


版权声明

Scholar’s Blog by scholargeek is licensed under a Creative Commons BY-NC-ND 4.0 International License.
董仕麟创作并维护的scholargeek博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于Scholar’s Blog博客,版权所有,侵权必究。

本文永久链接:https://scholargeek.github.io/2018/02/18/C%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A09/

更新日期:


本站总访问量