1、函数是什么?
函数就是一种工具,你需要的时候就可以调用他,简化写代码的工作量
每个C语言程序至少有一个函数,即主函数main()
2、C语言中函数的分类
2.1、库函数
库函数:是预先编写好的、可供程序员直接使用的函数
注意:1、使用库函数必须包括#include对应的头文件(就是" "或< >里的.h文件),
因为要使用就头文件里面的东西(比如scanf,printf函数),就要声明(让编译器知道在哪个头文件里,然后调用)
库函数相关头文件:https://zh.cppreference.com/w/c/header
(种类较多,慢慢学习一一攻克,配合题目学习)
库函数学习和查看工具:
C/C++官方的链接:https://zh.cppreference.com/w/c/header
cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/
2.2、自定义函数
返回类型 函数名称( 参数 )
{
函数体
}
返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
函数体:函数体包含一组定义函数执行任务的语句。
————————————————
原文链接:https://blog.csdn.net/i_r_o_n_m_a_n/article/details/122018751
补充:1、viod是不返回数值的类型的关键字
2、函数名称可以自己定义
3、函数的参数
3.1实际参数(实参)
实参就是调用函数时传递的那个参数。
实参可以是:常量,变量,表达式,函数等
无论是哪种类型的量,在进行函数调用时,他们必须都有确定的量,以便把这些值传给形参
3.2、形式参数(形参)
形参就是函数名后括号中的变量。
为什么叫形式参数呢?
实际上,如果只是定义了函数,而不去调用的话,函数的参数x和y只是形式上存在的,不会向内存申请空间,不会真实存在的,所以叫形式参数。
形式参数只有在函数被调用的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就是形参的实例化
小注意点:
思考:为什么一个用到指针,一个没有用?
//交换a,b的值 //a,b值相加
#include<stdio.h> #include<stdio.h>
viod Swap(int*px,int*py) int Add(int x,int y)
{ {
int z=0; int z=0;
z=*px; //p可加可不加 z=x+y;
*px=*py; return z;
*py=z; }
}
int main() int main()
{ {
int a=0; int a=0;
int b=0; int b=0;
scanf("%d%d",&a,&b); scnaf("%d%d",&a,&b);
printf("a=%d,b=%d",a,b); int c=Add(a,b);
return 0; printf("c=%d",c);
} return 0;
}
当实参传给形参的时候,形参是实参的临时拷贝,对形参的修改不能改变实参
因为转换值的时候改变了数值,改变了实参
传参时是否要传地址取决于是否要改变实参的值,一个地址对应一个值,交换地址就交换了值
大白话:两个人到了不同宿舍,但是人不动,只是交换他们两个人的宿舍。在表里改变他们的宿舍,人没有直接移动
4、函数的调用
4.1、传值函数
将实参的值复制粘贴到函数中,实参值不变
4.2、传址调用(类似超链接)
传地址用指针接收,形参的指针里存的是实参的地址
传址函数将函数和函数外的变量建立联系,也就是函数内部可以直接操作函数外部变量(跟上面大白话理解相同)
4.3、
5、函数的嵌套调用和链式访问
5.1、嵌套调用
这不是嵌套函数,而是嵌套定义,不可嵌套定义
int Add(Sub(int x,int y),inty);
这样是可以的
5.2、链式访问
链式访问是通过函数的返回值作为另一个函数的参数被使用
为什么打印的是4321?
首先要知道printf返回值 返回的是所打印字符的个数
其次printf函数先打印输出,再将返回值给后面的函数 ,返回2(43是2个),2作为下一层printf打印的参数被打印出来,2是一个,所以打印1,最后呈现出来的是4321
不正确的函数写法:
没有说明返回值,编译器只能返回printf的返回值
这样的写法就是说明main函数不需要参数
注意:使用链式访问前提是函数要有返回类型(一定要写),否则不能使用,类型是viod就无法实现链式访问
6、函数的声明和定义
6.1、函数的声明
1、告诉编译器有这个函数,叫什么,参数是什么。但存不存在取决于定义
2、一般放在前面
3、声明一般放在头文件中
意思是:
函数的声明和定义分别放在不同地方,使用时放在头文件中#include"add.h"
6.2、函数的定义
将函数定义最好放前面,因为编译器从上到下扫描,可以正常运行,但是会警告
但在前面加上声明就不会报错