- day3
- 一、函数(续)
- 4.递归函数
- 4.1 概念
- 什么是递归函数?
- 所谓递归函数是指一个函数的函数体中直接调用或间接调用了该函数自身的函数。这里的直接调用是指一个函数的函数体中含有调用自身的语句,间接调用是指一个函数在函数体里有调用了其它函数,而其它函数又反过来调用了该函数的情况。
- 如何理解
- 1.从调用自身层面:函数递归就是函数自己调用自己。
- 2.从编程技巧层面:一种方法(把一个大型复杂的程序转换为一个类似的小型简单的程序),这种方法的主要思想就是把大事化小,化繁为简。
- 4.2执行过程
- 递归函数调用的执行过程分为两个阶段:
- (1)递推阶段:从原问题出发,按递归公式递推从未知到已知,最终达到递归终止条件。 就是从最里层开始算,然后一层一层算,直到终止。
- (2)回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解。
- 二、结构体struct
- 1.结构体的基本用法
- 1.1 定义
- 结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义。
- 1.2 结构体定义格式
- struct 结构体名 { 数据类型 成员变量1; 数据类型 成员变量2; 数据类型 成员变量3; };
- 1.3 结构体变量
- 1.3.1 概念
- 1.3.2 格式
- 1.3.3 定义结构体变量
- (1)先定义结构体,再定义结构体变量 struct 结构体名 { 成员变量; }; struct 结构体名 变量名;
- (2)定义结构体的同时定义结构体变量 struct 结构体名 { 成员变量; }变量名;
- (3)也可以缺省结构体名定义结构体变量 struct { 成员变量; }变量名;
- 1.3.4 结构体变量赋值
- 先定义一个结构体 struct student { char name[32]; int age; int score; };
- (1)定义结构体变量的同时直接用花括号赋值
- (2) 定义结构体变量的同时用点等法赋值
- (3)定义结构体变量时未初始化赋值
- 1.3.5 访问结构体成员变量
- 1.4 重定义typedef
- 1.4.1 基本用法
- (1).给普通变量重命名 typedef int size4; size4 a = 10; //等同于int a=10;
- (2). 给指针类型重命名 typedef int *int_p; int_p p = &a; //等同于int *p=&a;
- (3). 给数组类型重名 typedef int intArr5[5]; intArr5 arr = {1, 2, 3, 4, 5}; //等同于int arr[5]={1,2,3,4,5};
- 1.4.2 定义结构体的同时重定义
- 1.4.3 先定义结构体,然后重定义
- 2.结构体数组
- 2.1 概念
- 2.2 定义格式
- (1)定义结构体同时定义结构体数组
- struct student { char name[32]; int age; }stu[3];
- (2)先定义结构体,然后定义结构体数组
- struct student { char name[32]; int age; }; struct student stu[3];
- 2.3 初始化
- (1)定义结构体数组同时赋值
- (2)先定义结构体数组,在对数组的每一个元素分别赋值
- 2.4 结构体数组输入输出(for循环)
- 3.结构体大小以及对齐原则
- 3.1 结构体大小可以用sizeof得出
- sizeof(struct 结构体名) 或者 sizeof(结构体变量名) 结构体数组:结构体类型大小*元素个数,也可以sizeof(数组名);
- 3.2 字节对齐原则
- (1).第一个成员在相对于结构体变量起始位置偏移量offset为0的地址处(通俗点来说,就是第一个成员变量的地址与结构体起始位置的地址是相同的),以后每个成员按定义顺序依次存放在offset为该数据成员大小的整数倍的地方,只有double类型存放在4的整数倍的地方(比如int在32位机器位4字节,要从4的整数倍开始存储)。
- (2).用结构体里面最大的数据类型的大小和8(32位系统和4)进行比较,按照字节数小的为单位开辟空间。
- 例如:
- struct stu { char a; char b; int c; }; //sizoef(struct stu) 等于8
- struct stu { char a; int c; char b; };//sizoef(struct stu) 等于12
- 3.3 节省空间原则
- 为了减少空间浪费,把占用空间小的成员集中到一起。
-

- 4.结构体指针
- 4.1 概念
- 4.2 定义格式
- 4.3 结构体指针成员变量赋值
- 格式:指针变量名->成员变量名 p->age=10; strcpy(p->name,"xiaowang"); 或者:(*p).age=20; //不常用
- 4.4 大小
- 4.5用typedef同时给结构体以及结构体指针类型重命名
- 5.结构体内结构体
- 5.1概念
- 如果成员变量本身属于另一种结构类型,用若干个成员运算符.一级一级找到最低级的成员变量。
- 5.2关于结构体总结
- 1.不能把结构体类型变量作为整体引用,只能对结构体类型变量中的各个成员变量分别引用。
- 2.如果成员变量本身属于另一种结构体类型,用若干个成员运算符.一级级找到最低级的成员变量。
- 3.可以把成员变量当成普通变量运算
- 三、共用体
- 1.概念
- 共用体有时候也称为联合体,用法类似结构体struct,区别在于结构体所占内存大于等于所有成员占用内存总和。而共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。 共用体大小是其中最大的成员大小,如果修改其中某个成员的值其他成员也随之修改。
- 2.格式
- 3.定义共用体union变量
- 4.特性
- (1)共用体成员共用一块地址空间
- (2)赋值顺序以最后一次赋值为准
- (3)共用体大小为成员类型最大的数据大小
