一。结构体
为将不同数据类型,但相互关联的一组数据组合成一个有机整体使用,C语言提供一种称为“结构”的数据结构。
1.结构体类型的定义与变量说明
结构体定义:
struct 结构体类型名
{类型标示符 成员名1;
类型标示符 成员名2;
...
类型标示符 成员名n;
};(注意分号哦)
struct:定义结构体类型的关键字
域:结构体类型定义中的每一个成员;成员名的命名规则和变量相同,同一结构体的同层成员不可同名
2.结构体类型变量的定义
(1)先定义结构体类型再定义变量名
struct 结构体名 结构体变量名表
(2)在定义类型的同时定义变量
struct 结构体名
{成员表列}变量名表列
(3)直接定义结构类型的变量
struct
{成员表列}变量名表列;
3.结构体类型的嵌套
结构体成员又是一个结构体变量
嵌套结构体变量的引用:点标记法 ,但只能对最低成员进行赋值或存取运算
4.结构体类型变量引用与初始化
(1)引用:不能将一个结构体变量作为一个整体进行输入和输出,只能对各个成员分别输入输出
成员的引用方式:结构体变量名。成员名
成员运算符.在所有运算符中优先级最高
(2)定义时初始化:将各元素初值放在{}里赋值给变量
5.结构体与数组
结构体数组变量的定义:与结构体变量定义相似,只是结构体变量名现为结构体数组变量名
6.结构体数组变量的初始化与引用
初始化:数组={初值表列};
引用:结构体数组分量.结构体成员
计算一个班学生的三门课程的平均成绩,并输出该班学生姓名及平均成绩
#include
#define MAXSIZE 100
struct student
{char name[16];
int grade[3],average;};
void main()
{int i,j,num,s;
struct student stu[MAXSIZE];
printf("enter the number of students:\n");
scanf("%d",&num);
for(i=0;i
{printf("enter name:\n");
scanf("%s",stu[i].name);
printf("enter the grades(3):\n");
for(j=0,s=0;j<3;j++)
{scanf("%d",&stu[i].grade[j]);
s=s+stu[i].grade[j];}
stu[i].average=s/3;}
for(i=0;i
printf("%s %d",stu[i].name,stu[i].average);
}
7.结构体类型与指针
一个结构体变量的指针就是该结构体变量所占据的内存的起始地址
指针变量可存放结构体变量的指针
指针变量不仅可以用来指向结构体变量,还可以用来指向结构体数组中的元素
形式:struct 结构体类型名 *结构体指针名
结构体变量的访问形式:
结构体变量名.成员名
(*结构体指针名).成员名
结构体指针名->成员名
用指向结构体变量的指针来访问学生的各项数据
#include
struct stu
{int num;
char *name;
char sex;
float score;}boy={102,"zhangping",'M',78.5},*p;
void main()
{p=&boy;
printf("%d %s\n",boy.num,boy.name);
printf("%c %4,1f\n",boy.sex,boy.score);
printf("%d %s\n",(*p).num,(*p).name);
printf("%c %4,1f\n",(*p).sex,(*p).score);
printf("%d %s\n",p->num,p->name);
printf("%c %4,1f\n",p->sex,p->score);
}
输出数组中各元素中各成员的值
struct student
{int num;
char name[20];
char sex;
int age;};
struct student stu[3]=
{{10101,"zhang",'M',18}
{10102,"Li",'M',19}
{10103,"wang",'F',20}
};
main()
{struct student *p;
printf("No. Name sex age\n");
for(p=stu;p
printf("%d %s %c %d\n",p->num,p->name,p->sex,p->age);
}
8.结构体与函数
结构体变量作为函数的参数
将1个结构体变量的值传递个1个函数,方法有二:
(1) 用结构体变量的成员参数,用法和普通变量作实参是一样的,属“值传递”方式
(2) 用指向结构体变量(数组的指针做实参,将结构体变量数组的地址传给形参)
编写一个和函数,计算制定学生的6科平均恒基,根据平均成绩评定等级
结构类型:
struct student
{
char name[20];
char num[10];
float score[6];
float ave;
};
main()
{struct student a[100];
int i,j,n;
float sum;
scanf("%d",&n);
for(i=0;i
{scanf("%s",a[i].name);
scanf("%s",a[i].num);
for(j=0;j<6;j++)
{scanf("%f",&a[i].score[j]);
sum=sum+a[i].score[j];}
a[i].ave=sum/6;}}
将6门课程数据输入定义为函数input,函数返回值为结构型地址
struct student input(void)
{struct student stud;
int i;float sum;
scanf("%s",stud.name);
scanf("%s",stud.num);
for(i=0;i<6;i++)
{scanf("%f",&stud.score[i]);
sum=sum+stud.score[i];}
stud.ave=sum/6;
return stud;}
main()
{struct student a[100];
int i,j,n;
struct student input(void);
scanf("%d",&n);
for(i=0;i
a[i]=input();}
二。共用体与其他数据类型
1.使几个不同的变量占用同一段内存空间的结构成为共用型
共用型的定义:间接定义(先定义类型,再定义变量)
直接定义(定义类型的同时定义变量)
共用体占用的内存空间,等于最长成员的长度,而不是各成员长度的和
共用变量的引用:与结构变量一样,也只能逐个引用共用变量的成员
特点:系统采用覆盖技术,实现共用变量各成员的内存共享,所以在某一时刻,存放的和起作用的是最后一
次存入成员的值
由于所有成员共享同一内存空间,故共用变量与其成员的地址相同
不能对共用变量进行初始化;也不能将其作为函数参数,以及使函数返回一个共用数据,但可以使用
指向共用变量的指针
共用类型可以出现在结构类型定义中,反之亦然
2.枚举类型
枚举类型定义:enum 枚举类型名 {取值表};
枚举变量定义:间接定义,直接定义
说明:枚举型仅适用于取值有限的数据
取值表中的值称为枚举元素,其含义由程序解释
枚举元素作为常量是有值的:定义时的顺序号(从0开始),所以枚举元素可以进行比较,比较规则
是:序号大者为大
枚举元素的值也可以改变的:在定义时由程序指定
3。用type定义类型
除可直接使用C提供的标准类型和自定义的类型外,也可以用typedef定义已有类型的别名,该别名与标准类型名一样,可用来定义相应的变量
typedef与#define有相似之处,但二者是不同的:前者是由编译器在编译时处理的;后者是由编译预处理器在编译预处理时处理的,而且只能做简单的字符串替换
4.位段结构
有时存储1个信息不必占用1个字节,只需二进制的1个位就够用
概念:位段类型是一种特殊的结构类型,其所有成员均以二进制为单位定义长度,并称成员为位段
CPU状态寄存器:
struct status
{unsigned sign:1;
unsigned zero:1;
unsigned carry:1;
unsigned: 0;
unsigned parity:1;
unsigned half_carry:1;
unsigned negative:1;
1个位段必须存储在1个存储单元中,不能跨越2个。如果本单元不够容纳某位段,则从下1个单元开始存储该位段
可以用%d %x %o %u等格式字符以整数形式输出位段
在数值表达式中引用位段时,系统自动将位段转换为整型数
}flags;
阅读(2020) | 评论(0) | 转发(0) |