若排版有错误,请查看PDF:C语言 - 08 变量、结构体、枚举.pdf
第十五章 变量
一、 根据变量的作用域,可以分为:
1. 局部变量:
1) 定义:在函数(代码块)内部定义的变量(包括函数的形参)
2) 作用域:从定义变量的那一行开始,一直到代码块结束
3) 生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收
4) 没有固定的初始值
2. 全局变量
1) 定义:在函数外面定义的变量
2) 作用域:从定义变量的那一行开始,一直到文件结尾(能被后面的所有函数共享)
3) 生命周期:程序一启动就会分配存储空间,程序退出时才会被销毁
4) 默认的初始值就是0
第十六章 结构体
一、 定义结构体
1. 定义结构体类型(并不会分配存储空间)
struct Person
{ // 里面的3个变量,可以称为是结构体的成员或者属性
int age; // 4个字节 年龄
double height; // 4个字节 身高
char *name; // 8个字节 姓名
};
2. 根据结构体类型,定义结构体变量(真正分配存储空间)
// 补齐算法(对齐算法)
// 结构体所占用的存储空间必须是最大成员字节数的倍数
struct Person p = {20,1.55, "jack"};
p.age = 30;
p.name = "rose";
printf("age=%d, name=%s, height=%f\n", p.age, p.name, p.height);
/* 错误写法,只能在定义的时候初始化
structPerson p2;
p2 ={30, 1.67, "jake"};
*/
struct Person p2 = {.height =1.78, .name="jim", .age=30};
p2 = p; // 将p中的各个值对应地赋值给p2
二、 定义结构体变量的3种方式
1. 先定义类型,再定义变量(分开定义)
struct Student
{
int age;
};
struct Student stu;
2. 定义类型的同时定义变量
struct Student
{
int age;
} stu;
struct Student stu2;
3. 定义类型的同时定义变量(省略了类型名称)
struct
{
int age;
} stu;
三、 结构体类型的作用域
1. 定义在函数外面:
全局有效(从定义类型的那行开始,一直到文件结尾)
2. 定义在函数(代码块)内部:
局部有效(从定义类型的那行开始,一直到代码块结束)
四、 定义结构体数组
struct RankRecord
{
int no; // 序号 4
int score; // 积分 4
char *name; // 名称 8
};
struct RankRecordrecords[3] =
{
{1, "jack", 5000},
{2, "jim", 500},
{3, "jake",300}
};
records[0].no = 4;
// 错误写法
//records[0]= {4, "rose", 9000};
五、 指向结构体的指针
1. 指向结构体的指针的定义
struct RankRecord *p;
2. 利用指针访问结构体的成员
1) (*p).成员名称 //()表示访问整体
2) p->成员名称
struct RankRecord *p; // 指针变量p将来指向struct RankRecord类型的数据
p = &record[1]; // 指针变量p指向record[1]
// 第一种方式
printf("score=%d,no=%d\n",record[1].score, record[1].no);
// 第二种方式
printf("score=%d,no=%d\n",(*p).score, (*p).no);
// 第三种方式
printf("score=%d,no=%d\n",p->score, p->no);
六、 结构体与函数
// 如果结构体作为函数参数,只是将实参结构体所有成员的值对应地赋值给了形参结构体的所有成员
// 修改函数内部结构体的成员不会影响外面的实参结构体
void test(struct RankRecord s)
{
s.score = 30;
s.no = 2;
}
// 会影响外面的实参结构体
void test2(struct RankRecord *p)
{
p->age = 15;
p->no = 2;
}
七、 结构体的嵌套定义
struct Date
{
int year;
int month;
int day;
};
// 类型
struct Student
{
int no; // 学号
struct Date birthday; // 生日
struct Date ruxueDate; // 入学日期
//这种写法是错误的
//structStudent stu;
};
struct Student stu = {1, {2000,9, 10}, {2012,9, 10}};
printf("year=%d,month=%d,day=%d\n", stu.birthday.year, stu.birthday.month,stu.birthday.day);
第十七章 枚举
一、 定义枚举
1. 定义枚举类型只能取{}内的值
enum Season
{
spring, // 实际存储的是1
summer,
autumn,
winter
};
2. 定义枚举变量
enum Season s = spring;