大家好这里是Lovehutao。我们常说库函数,主函数,那么什么是函数呢?为什么我们需要主函数程序才能运行?库函数又代表了什么?想必大家和我一样好奇,那让我们进入函数的学习吧!
1. 什么是函数?
1)自定义函数的创建
我们在数学中都学过什么是函数吧,数学中函数的定义是给予一个元素A经过特定的法则下得到元素B,这个法则就被称之为函数。而在c语言中同样是如此,就拿我们熟知的一元函数举例,例如y = x + 2就是一个法则,当x = 2时经过这个法则我们能够得到y = 4。在c语言的表示形式如下所示:
外面的int是函数返回值(ret_type)的类型,括号内的int是形式参数的类型,add是函数名(name)。
如上所示我们就创建了一个函数名为add,法则为x+2的函数,花括号内就是函数体。
2)库函数以及主函数是什么?
a.库函数就是系统自带的已经为你命名好了且帮你制定好规则的函数的集合。库函数是在头文件的标准库声明的,而想要使用这些函数就需要对头文件进行声明。
b.主函数则是程序的入口,程序依靠主函数来执行代码主要逻辑,并与计算机系统交互。
3)自定义函数以及库函数的声明
c语言中,当你把自定义函数写在头文件中时,又或者是想要使用c语言自带的库函数时,我们就需要对头文件进行声明(我这里已经将上面的add函数放到名为add.h的头文件中了),如下所示:
2.行参与实参
#include "add.h"
#include <stdio.h>
int main()
{
int a = 0,b = 0;
b = add(a);
return 0;
}
1)实参
实参也叫做实际参数,代表的是传给函数的值,例如上图括号中的a。
2)形参
由于我们已经将add函数放在了名为add.h的头文件中,因此我们可以通过声明来直接使用之前创建的add函数,而形参就是括号内的int x,如下:
3)形参与实参的关系
实参是真实传递给函数的参数,而形参则只是在形式上存在,因此当你改变形参的时候实参不会发生改变,也不会影响到实参,如下所示: (由于形参的改变不影响实参,因此依旧打印5)
add(int x)
{
x = 0;
}
int main()
{
int x = 5;
printf("%d",x);
return 0;
}
我们可以通过调试来大致说明形参与实参的关系如下所示:
我们可以看到在调试中x,y的地址与a,b不同因此x,y的改变不会影响到a,b。
3.return语句
根据前面的内容我们知道,当你需要函数返回值的时候,我们需要再前面加上返回值的类型,然后加上return语句,然后函数就会返回一个值给主函数。那如果我们不像让他返回值怎么办呢?
当我们不想让函数返回值时,我们需要在函数前面加上void表示函数不返回值。同样当我们不需要参数时也可以在括号里加上void,此时括号内的void可省略,如下所示。
void add(void)
{
}
void add()
{
}
4.数组做函数参数
当我们使用函数解决问题的时候难免会使数组作为函数的参数,那当我们需要以数组为参数时,需要注意一下几点。
1)形参中的元素个数应与实参中的元素个数相等。
2)当数组是一维数组时,可以省略数组的大小。
3)当数组是二维数组时,行可以省略但列不能省略。
4)数组传参,形参是不会创建新的数组的,也就是说此时形参和实参操作的是同一个数组。
例:利用数组传参我们可以实现将数组中的所有元素初始化为1,并打印出来,如下:
#include <stdio.h>
void Ini(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
arr[i] = 1;
}
}
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
Ini(arr, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}