引言
C语言学习笔记(上)-CSDN博客、C语言学习笔记(中)-CSDN博客、C语言学习笔记(下)-CSDN博客这三篇博客已经将C语言的知识点介绍了一下,C语言的基础部分还差函数的知识点还未介绍,本篇笔记将书接上文,补充函数的相关知识点。
一、函数
函数就是将能实现某些功能的代码封装成代码块,当想要调用函数相应的功能时,可以使用定义的函数名字调用这个功能。例如puts、gets、printf、scanf等函数。
1.函数的结构
返回值类型 函数名(函数的参数列表){
此处写实现功能的代码块
}
1.1函数结构举例
void myfunction(void){
printf("hello world\n");
return;
]
这个函数的功能时打印一次hello world,void是函数的返回值类型,myfunction是函数名,{}里面的是函数体,return是用来返回函数执行的结果,没有函数值的时候直接写return,或者不写,如果有返回值,返回值的类型需要和函数名前面的类型保持一致。
2.函数调用
一个完整的程序是由一个main函数和若干个子函数构成的。
函数一但定义好之后,就可以被其他的函数调用了。
2.1调用函数的格式 :
函数名(参数)
如果没有参数,()必须写,并且智能空着,不能写void ,程序的执行顺序是遇到调用的函数,则先跳到调用的函数执行,执行完成后回调到主函数。
3.函数的声明:
函数的声明的作用就是提前将函数加载一下,避免函数之间相互调用的时候出现不认识的情况,产生报错。
4.函数的参数:
在函数中实现功能的过程中,有些值和函数内部并没有的,这时就需要调用者通过参数的方式将函数传递过去
函数的参数有着实际参数和形式参数之分,函数的调用()里面的叫做函数的实际参数,定义函数的()里面的叫函数的形式参数,函数中使用形式参数相当于使用实参的值,并且更改形式参数,并不会改变实际参数的值,因为形式参数和实际参数不在同一块内存空间。
5.函数的返回值:
函数的返回值是为了在有些函数的返回值给调用者,调用者可以自己决定如何处理这个执行的结果,需要用到的函数的返回值就写,如果不需要用,也可以不写。
6.全局和局部:
全局变量和局部变量之间的区分是看占用的空间什么时候被收回,还有在哪个范围内可以访问。
6.1全局变量
没有被任何{}包住的就叫做全局变量,如果全局变量初始化了就在data段,没初始化就在bss段。生命周期是整个程序结果,作用域是整个文件。
6.2局部变量
被{}包住的变量叫做局部变量,局部变量在栈区。生命周期就是最近的{}结束,作用域是当前最近的{}内部。
7.函数的传参方式
7.1全局传参
一般情况下,不常用
7.2复制传参(值传递)
功能就是将函数内部的计算的结果赋值给另一个变量,这种的传参方式叫做复制传参(值传递)。下面的例子就是如此,x和y计算后的结果赋值给z
void my_function(int x,int y,int z){
x = x*2;
y = y*2;
z = x+y;
}
7.3地址传参(地址传递)
功能就是将函数内部的计算结果保存在一处内存空间,然后使用一个指针指向该内存,此时就是地址传参。下面的例子就是如此,x和y计算后的结果保存在某处内存,并用z指针指向该内存空间。
void my_function(int x,int y,int *z){
x = x*2;
u = y*2;
*z = x+y;
}
8.数组的传参方式
8.1字符串的传参
字符串传参只需要传递首地址就行,因为字符串有‘\0’作为结束的标志。数组传参传首地址相当于地址传递通过指针是可以修改实参的,所以这种情况一般都使用 const 修饰形参的指针,防止修改
8.2一维整型数组传参
一维整型数组的传参,既要传首地址,还要传数组的长度,
一般写法 void a_arr(int *p, int len)
8.3二维数组的传参方式
二维数组传参时需要用到数组指针
一般写法void a_arr(int (*p)[4], int hang, int lie)
9.指针函数
指针函数是一个函数,返回值是一个指针类型,指针函数不能返回局部变量的地址,因为函数调用结束后,局部变量占用的内存空间就被操作系统回收了,所以指针函数可以返回全局变量的地址,static关键字修饰的局部变量的地址、由参数传递过来的地址