C语言允许用户根据自己的需要建立自己的数据类型。
1. 定义和使用结构体变量
1.1结构体
结构体:C语言允许用户建立不同数据类型组成的组合型数据结构(有些高级语言称为记录record)
定义
struct 结构体名
{成员列表};
结构体的成员定义:类型名 成员名;
注:
一般结构体名第一个字母大写。
成员可以是另一个结构体类型。
struct Date
{
int month;
int day;
int year;
};
struct Student
{
int num;
char name[20];
char sex;
int age;
struct Date birthday;
char addr[30];
};
1.2 定义结构体变量
1.2.1先声明结构体变量,再定义该类型的变量
structStudent
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
struct Student student1,student2;
或者
structStudent
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}student1,student2;
在定义了结构体变量时系统会位置分配内存空间
student1所占的内存:4+20+1+4+4+30=63
但是如果sizeof(structStudent student1)必然是64,因为计算机对内存的管理是以‘字’为单位,一个字节占不满一个字也不会存放数据。因此分配的字节数必然是4个倍数
1.2结构体变量的初始化和引用。
(1)在定义结构体变量时进行初始化:
struct Student b={.name=”xiaowang”};
.name 是b.name 的隐含写法。其他没有初始化的成员,数值型被系统初始化为0,字符型成员被初始化为’\0’,指针型成员被初始化为NULL
(2)引用某个成员进行赋值:
student1.num=10010;
student2.birthday.month=12;
(3)结构体变量的成员和普通变量相同,可以进行各种运算
(4)同类型结构变量可以相互赋值
2. 使用结构体数组
struct Student stu[10];
3. 结构体指针
3.1定义:struct Student *pt=student1;
通过指针可以引用结构体的各个成员。
使用指向运算符-> pt->name=12;
3.2指向结构体数组的指针。
struct Student stu[10],*ps=stu;
ps++,ps--,ps+1,ps-1,都是以每个结构体变量为单位的,指向
注意 (++p)->num 和(p++)->num区别,后者先算p->num的值然后p++
如果:ps=stu[0].name; 编译会发出警告:数据类型不匹配,可以用强制类型转换 ps=(structStudent *)stu[0].name;
3.3用结构体变量和结构体指针作为参数
一般不用结构体变量作为实参,不能将处理结果返回,一般用指针。
综合例子: 有n个结构体变量,内含学生学号姓名和三门课的成绩。要求输出平均成绩最高的那个学生的信息
#include <stdio.h>
#define N 3
struct Student
{
int num;
char name[20];
float score[2];
};
int main()
{
void input_message(struct Student *ps);
void process(struct Student *ps);
struct Student stu[N];
input_message(stu);
process(stu);
return 0;
}
void input_message(struct Student *ps)
{
int i;
struct Student *p=ps;
printf("Input the message of students:\n");
printf("num name socre1 score2\n");
for(i=0;i<N;i++)
{
scanf("%d%s%f%f",&p->num,p->name,&p->score[0],&p->score[1]);
p++;
}
}
void process(struct Student *ps)
{
int i;
struct Student *p=ps,*p_max=ps;
for(i=0;i<N-1;i++)
{
if((p->score[0]+p->score[1])>((p+1)->score[0]+(p+1)->score[1]))
p_max=p;
else
p_max=p+1;
p++;
}
printf("num:%d name:%s score:%f %f\n",p_max->num,p_max->name,p_max->score[0],p_max->score[1]);
}
4.共用体类型
5. 枚举类型
enum Weeday{sun,mon,tue,wed,thu,fri,sat};
enum Weekday workday,weekend;(链各个枚举类型变量)
声明枚举类型格式:
enum [类型名] {枚举元素列表}
注意:
(1) C编译对枚举类型的枚举元素按常量处理。
(2) 每个枚举元素代表一个整数,C语言编译按照定义的顺序默认它们的值0,1,2,3(也可以自己指定如workday=mon)
(3) 枚举元素可以用来作比较if(workday==mon)
#include <stdio.h>
enum Weekday{sun,mon,tue,wed,thu,fri,sat};
int main()
{
printf("%d\n",sun);
printf("%d\n",sat);
return 0;
}