结构体
一、前言
1.1 数据类型
基本数据类型:char int float double
构造数据类型:数组,结构体,
指针类型 : 数据类型 *
1.2 数组的特点
int a[10];
1)元素的数据类型相同
2)可以存储大量的数据
3)数据的含义一样
4)数组中数据的元素是没有联系的,是独立的存在
二、结构体
2.1 结构体的特点
如果要记录一个人的成绩、学号、姓名、性别、年龄就要需要多个变量,为了归类这些变量,就要引入结构体。
结构体的特点
1)数据类型可以不同也可以相同
2)也是可以存储大量的数据
3)数据的含义部不相同
4)数据之间有联系
2.2 结构体类型的定义
struct 结构体名
{
成员列表;
};
说明:struct 关键字,表示为结构体类型
结构体名:符合标识符的命名规则,一般大写
成员列表:数据类型 成员名
成员名符合标识符的命名规则
注意:a) 大括号后面的分号一定要写
b) 定义结构体类型时,系统不会分配内存
c) 成员之间用分号
d) 结构体之间可以嵌套,但是必须在使用它之前定义好
结构体类型:struct 结构体名
struct BIR
{
int year;
int month;
int day;
};
struct STU
{
int num;
char name[10];
int score;
char sex;
};
2.3 结构体类型变量的定义
结构体类型变量的定义:
1)在定义结构体类型的同时,定义结构体变量
struct STU
{
int num;
char name[10];
int score;
char sex;
}a;
2)先定义好结构体类型,再定义结构体类型变量
struct STU
{
int num;
char name[10];
int score;
char sex;
};
struct STU a,b;
3)在定义结构体类型的时候,不加结构体名,直接定义结构体类型的变量
struct
{
int num;
char name[10];
int score;
char sex;
}a;
4)结构体类型的嵌套
struct BIR
{
int year;
int month;
int day;
}t;
struct STU
{
int num;
char name[10];
int score;
char sex;
struct BIR t;
}a;
2.4 结构体类型变量的初始化
struct STU
{
int num;
char name[10];
int score;
char sex;
struct BIR t;
};
struct STU a={101,"zhangsan",89,'M',{1994,2,1}};
struct STU a={101,"zhangsan",89,'M',1994,2,1};
注意:结构体类型的变量在进行初始化的时候,不能跳跃式初始化
初始化的时候用大括号{}进行初始化,列表里面的数据用逗号隔开
除了初始化的时候可以对结构体变量整体赋值,其他情况不行
结构体变量与变量之间可以进行整体赋值
struct STU
{
int num;
char name[10];
int score;
char sex;
struct BIR t;
};
struct STU a={101,"zhangsan",89,'M',{1994,2,1}};
struct STU b;
b=a;
b={}//不合法的
2.5 结构体类型变量的赋值
1)结构体类型变量的引用
变量名.成员名
2)结构体变量的赋值
struct STU b;
b.num=101;
scanf("%s",b.name);
gets(b.name);
b.t.year=1994;
b.t.month=12;
3)说明:对结构体成员进行赋值的时候,一定要注意成员本身的特性
对于数组来说,在赋值的时候,不能整体赋值,必须采用其他方式
如 scanf("%s",成员)、 gets(成员)
结构体里面有嵌套结构体的时候,要注意一层一层的进入,而且每层都有一个 “.”;
2.6 结构体类型的大小
struct BIR
{
int year;
int month;
int day;
}t;
struct STU
{
int num;
char name[10];
int score;
char sex;
struct BIR t;
};
结构体类型大小:结构体成员类型所占空间的总和–是单个成员的数据类型所占空间的最大的数据类型(基本数据类型)的整数倍,因为空间的总和所要遵循的是空间对齐。
2.7 结构体数组
1)结构体数组的定义
a) 在定义结构体的同时,定义结构体类型的数组
b) 先定义结构体,在定义结构体类型的数组
c) 在定义结构体的同时不加结构体,定义结构体类型的数组
2)结构体数组的初始化
struct BIR
{
int year;
int month;
int day;
}t;
struct STU
{
int num;
char name[10];
int score;
char sex;
struct BIR t;
};
struct STU b[3]={
{101,"黎明",90,'m',1996,7,8},
{102,"ling",78,'M',1992,8,9},
{103,"libfs",98,'F',1994,7,9}
};
2)结构体数组的赋值,引用
数组引用成员的方式:数组名[下标].成员名
注意:结构体数组的本质还是数组,那么除了初始化以外,就不能整体赋值
struct STU b[3];
b[0].num=101
gets(b[0].name);
b[0].sex='m';
b[0].score=90;
for(i=0;i<3;i++)
{
scanf("")
}
练习题:3个学生,成绩,有姓名,有学号,有性别,有年月日
数据手动输入,把平均成绩算出来,找出最高的最低的,
并输出信息
三、结构体指针
3.1 结构体指针的定义
a) 在定义结构体的同时,定义结构体类型的指针
b) 先定义结构体,在定义结构体类型的指针
c) 在定义结构体的同时不加结构体,定义结构体类型的指针
3.2 结构体指针的初始化
struct STU b[3];
struct STU a;
struct STU *p=b;
struct STU *pf=&a;
结构体指针引用成员:
(*指针名).成员名
指针名->成员名
四、typedef 类型重定义的关键字
给数据类型取了一个别名,不是创造了一个新类型。
形式:typedef 原来的类型名 新名字
typedef一般放在主函数之前
typedef unsigned int u32
unsigned int a;
u32 b;