比特鹏哥6-函数【自用笔记】
1.函数的概念
2.库函数
库函数的使用方法
#include<math.h>
int main(){
double d=16.0;
double r=sqrt(d);
printf("%lf",r);
return 0;
}
### 4.000000 ###
3.自定义函数
语法结构
ret_typr fun_name(形式参数)
{
函数体
}
ret_typr 函数返回类型 void 作为函数返回类型的时候,表示什么都不返回。
fun_name 函数名
()括号内是形式参数
{ }括号内是函数体
/计算两个数的和
int Add(int x,int y) {//函数类型是 int; 函数名称是Add; 函数个数是2个;
int z = 0;
z = x + y;//此时的a和b是形式参数,形参
return z;
}
int main(){
int a = 10;
int b = 100;
//输入
scanf("%d,%d", &a, &b);
int c = Add(a, b);//a和b是真实传递给Add的参数,是实际参数,实参
printf("%d", c);
return 0;
}
4.形参和实参
实参
真实传递给函数的参数,是实际参数,实参
形参
实际上,如果只是定义了 Add 函数,而不去调用的话, Add 函数的参数x和 y只是形式上存在的,不会向内存申请空间,不会真实存在的,所以叫形式参数
实参与形参的关系
5.return语句
return后边可以是一个数值,也可以是一个表达式,如果是表达式则先执行表达式,再返回表达式的结果。
return后边也可以什么都没有,直接写 return;这种写法适合函数返回类型是void的情况。
return返回的值和函数返回类型不一致,系统会自动将返回的值隐式转换为函数的返回类型。
return语句执行后,函数就彻底返回,后边的代码不再执行。
如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误。
6.数组做函数参数
一维数组
void set_arr(int arr[], int sz) {
int i = 0;
for (i = 0; i < sz; i++);
{
arr[i] = -1;
}
}
printf_arr(int arr[], int sz) {
int i = 0;
for (i = 0; i < sz; i++);
{
printf("%d",arr[i]);
}
}
void main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
//写一个函数,使得arr数组里面的数值全部为-1;
set_arr(arr, sz);
//写一个函数,打印出arr数组里的全部内容。
printf_arr(arr, sz);
}
数组传参的几个重点知识
函数的形式参数要和函数的实参个数匹配
函数的实参是数组,形参也是可以写成数组形式的形参
如果是一维数组,数组大小可以省略不写形参
如果是二维数组,行可以省略,但是列不能省略
数组传参,形参是不会创建新的数组的
形参操作的数组和实参的数组是同一个数组
二维数组
7.传值调用
8.嵌套调用和链式访问
8.1嵌套调用
//求某年某月的天数
int is_leap_year(int y) {
//如果是闰年,返回1;
//如果不是闰年,返回0;
if ((y % 4 == 0 && y % 100 == 0) || (y % 400 == 0))
return 1;
else
return 0;
}
int get_days_of_month(int y, int m) {
//y=1999 m=2月 那么days[2]就是下标为2的28,再判断,y是不是闰年,是不是2月
int days[13] = { 0, 31 , 28 , 31 , 30 , 31 ,30,31,31,30,31,30,31 };
// 0月 1月 2月 3月 4月
int d = days[m];
if (is_leap_year(y) && m == 2);//是闰年还是2月,就要加一天
{
d += 1;
}
}
int main() {
int y = 0;//年
int m = 0;//月
scanf("%d,%d", &y, &m); //输入的是1999 2
get_days_of_month(y, m);
int d = get_days_of_month(y, m);
printf("%d", d);
return 0;
}
函数可以嵌套使用,但是不可以嵌套定义
8.2链式访问
将一个函数的返回值作为另一个函数的参数,像链条一样将函数串起来的函数就是链式访问。
//链式访问
int main() {
int len = strlen("asdfghj"); //7
printf("%zd", len);
return 0;
}
int main() {
printf("%zd", strlen("asdfghj"));
}
9.函数的声明和定义
一定要先声明 后使用
多个文件
一般情况下,
函数的声明,类型的声明是放在头文件(.h)的
函数的实现是放在原文件(.c)的
static 和 extern
extern是用来声明外部符号的。
static是静态的的意思,可以用
修饰局部变量:一定是{}内部的变量
修饰全局变量:{} 大括号外部定义的变量
修饰函数