函数
一、函数
1.定义
特定功能的代码块集合
【1】.函数的的定义
【2】.函数的使用
关注的问题:
(1).函数的功能
(2).函数的形参
(3).函数的返回值
2.函数的一般定义形式
<数据类型>函数名(<形参列表>){
函数体;
return<返回值>;
}
数据类型修饰的是返回值的类型
3.函数的声明
<数据类型>函数名(<形参列表>);
4.函数的调用
<数据类型>变量名 = 函数名(<实参>);
5.函数的传参
【1】.赋值传参
将实参的值传递给形参
【2】.地址传参
将实参的地址传递给形参
【3】.数组传参
传递数组名
======================================================
重点理解:
一维数组 int a [10] ---------> int a[]
本质是地址传参
二维数组 int a [3][4] ------------> int[][4]
运用数组指针
指针函数
本质:函数,函数的返回值是指针
一般定义形式:
<数据类型>*函数名(<形参列表>){
函数体;
return 地址常量/指针变量;
}
char *strcpy(char *dest, const char *src);
char *strcat(char *dest, const char *src);
函数指针
本质:指针,只想函数的地址(函数名) 指针变量
一般定义形式:
<数据类型>(*函数指针变量名)(<形参列表>);
函数指针调用函数方式
(*p)(参数)
p(参数)
调用:
函数指针变量名(<形参>);
(*函数指针变量名)(<形参>);
int test(int a,int b, int (*pFunt)(int m,int n));
函数指针数组
本质:数组,函数指针修饰,该数组的元素实函数指针
一般定义形式:
<数据类型>(*数组名[数组元素个数])(<形参列表>);
===================================================================
递归函数
是指一个函数在函数体中直接调用或间接调用自身的函数
递推阶段:
按递归公式递推从未知到已知,最终达到递归终止条件
回归阶段:
按递归终止条件推出结果,逆向逐步带入递归公式
举例:设计函数求n!(n的阶乘)
int func(int n)
{
if(n < 0){
printf("input error...\n");
return -1;
}
if(n <= 1){
return 1;
}else{
return (n*func(n-1)); 3 * func(2) --->>> 2 * func(1)
} 3 * 2 * 1 <<<--- 2*1 <<<---
}
二、条件编译和函数宏
#ifdef<宏名>
#else
#endif
作用:
1.工程可移植性
2.调试
3.用在头文件中防止重复包含
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
...
#endif
宏的使用:必须写在一行,使用\表示在同一行
do{
}while(0)
先执行后判断
#define DELETE_POINTER(p) \
do \
{ \
if(NULL != p) \
free(p); \
p = NULL; \
}while(0)
=============================================================
重点:
三、结构体
1.结构体定义
构造数据类型 自定义数据类型
struct 结构体数据类型名 {
成员变量;
。。。
};
用结构体数据类型定义的变量叫结构体变量
2. 结构体成员访问
3. 结构体变量赋值&初始化
4.结构体数组
数组元素是结构体变量的数组
<结构体数据类型>结构体数组名[元素个数];
5.结构体指针:
<结构体数据类型>* 结构体指针变量名;
6.结构体指针数组
<结构体数据类型>*数组名[元素个数];
===================================================================
四、共用体
union 共用体数据类型名{
成员变量;
};
区别:
结构体会为每一个成员变量分配空间,共用体分配最大的变量所占的空间。
特点:
一次只能用共用体中的一个成员变量
多次赋值会覆盖内容
大小端:
大端:数据的高字节存在内存的低地址
小段:反之