在本篇中就不说废话了,直接切入正题
文章目录
前言
函数说白了就是子程序,对代码的细节进行封装隐藏,也可以让代码重复使用
在C语言中函数非常常用,在写一个项目的时候肯定不能把代码全部写在main函数中,要是全写在main函数中代码不能重复使用,代码可读性也会不好。
把代码封装成函数的优点,能让代码重复使用。
一、C语言中函数的分类
函数分为库函数与自定义函数
1、库函数
为什么会有库函?
主要还是为了提高打代码效率,先拿常用的printf打印函数打个比方,要是没有printf库函数,就得靠自己自定义个功能函数,这一套过程下来很浪费时间,众所周知时间就是效率,刚好库函数的出现提高了的代码效率。
2.自定义函数
如果库函数能干所有的事情,那还要程序员干什么?
所有更加重要的是自定义函数。
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。
函数的组成:
代码如下(示例):
比较大小功能函数
后面会详细介绍
接下来介绍自定义函数的组成
int max(a,b)
{
//这种比较大小只能用在两数之间,不能给多组数比较
if(a>b) //第一种方法
{
return a; //返回值得跟返回类型一致
}
else
{
return b;
}
return (a>b)?a:b; //第二种方法比较简洁
}
int main()
{
int a = 12;
int b = 10;
max(a,b); //函数传参
return 0; //不写程序一样可以运行
}
返回类型分为有返回值跟无返回值
//有返回值先拿int类型做示范
int max(a,b) //max函数名可自定
//(a,b)形参
//void是无返回类型
void a(a,b)
3、函数的组成与需要注意的问题
重点:函数先声明在使用,例外条件是函数在main函数之前就不用先声明后使用
自定义函数名可自定,返回值得跟返回类型一致,返回类型根据函数内容返回,一般情况下都是用void。
二、函数的参数
函数得参数分为实参与形参,在来聊实参跟形参的区别。
初学者会迷惑实参与形参有什么实际区别,没详细了解又会有什么影响,我就在这详细的讲解。
涉及到了函数的传值调用与传址调用的区别。
函数的参数中分为实际参数与形式参数。
在调用函数时主函数需要给自定义函数传递参数,函数中有实参与形式之分,在主函数中的传值操作是实参,自定义函数的接收值操作是形参,形参是实参临时拷贝,修改形参对实参没有实际影响。
1、栈、堆、静区介绍
有利于对函数的了解
2、实参形参重点介绍
说白了就是实参与形参都占有独立的内存块,想用形参修改实参值。就得用实参把需要修改值的地址传递给Swap函数用指针进行接收,因为传过来的是地址必须用指针接收。
接下来代入代码
代码完整实例
接下用代码指出传值调用与传址调用的区别,就以两数互换为实例介绍
正确代码
void Swap(int*x,int*y)//形参
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);//实参
printf("%d %d", a, b);
return 0;
}
错误代码
void Swap(int*x,int*y)//形参
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(a,b);//实参
printf("%d %d", a, b);
return 0;
}
因为a,b值地址没有传递过去,在Swap函数中a,b值的互换是无效的,回顾上文实参与形参都有独立的内存块,形参的对实参值的修改是无效的,必须把a,b地址传递过去,然后在用指针接收进行修改。
3、实参
int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);//实参
printf("%d %d", a, b);
return 0;
}
4、形参
void Swap(int*x,int*y)//形参
{
int tmp = *x;
*x = *y;
*y = tmp;
}
5、 函数的嵌套调用和链式访问
5.1、嵌套调用
执行顺序,先从main最前面开始往后执行,调用规则同理,在调用print函数时一定要在a函数之前,不然会报错。
#include <stdio.h>
void print()
{
printf("hehe\n");
}
void a()
{
int i = 0;
for(i=0; i<3; i++)
{
print();
}
}
int main()
{
print();
return 0;
}
5.2、链式访问
把一个函数的返回值作为另外一个函数的参数。
#include <stdio.h>
#include <string.h>
int main()
{
char arr[20] = "hello";
int ret = strlen(strcat(arr,"world")); //字符拼接,然后计算字符串长度,从最里面的依次向外。
printf("%d\n", ret);
return 0;
}
6、函数的声明和定义
6.1、函数声明
告诉编译器有一个函数叫什么,参数是什么,返回类型是什么,具体存不存在函数声明决定不了
函数声明一般都在mian函数之前,要满足先声明后使用
函数声明一般都放在头文件中
6.2、函数定义
函数的定义是指函数的具体实现,交待函数的功能实现。