自定义函数的作用:
- 方便管理代码,编写程序时思路清晰。
- 代码复用,同一段代码可以在不同位置多次执行。
函数声明:
使用:返回值类型 函数名(类型 变量名,类型 变量名,…);
例如:int sum(int num1, int num2);
实际上,在函数声明时,变量的名称并不重要,只有返回值类型,函数名和变量的类型是编译器必须要知道的,因此变量名称是可以忽略的。下面的声明也是正确的:int sum(int , int);
注意:
- c语言一般根据函数的功能来取函数名,全部使用小写单词,多个单词之间用下划线分隔,如:add_to_arr。
- 参数的个数、类型由函数的功能决定,被调用时由调用者提供。如果函数不需要任何参数则写void,不要空着。
- 返回值类型根据函数的结果决定,如果不需要返回值则写void。
- 如果函数的定义出现在调用之前,声明可以省略。
- 函数声明时,参数的变量名可以省略。
- 如果不写返回值类型(会有警告),则默认为int类型返回值。
函数定义:
使用:
返回值类型 函数名(类型 变量名,类型 变量名,…)
{
函数体;
return (数据);
}
例如:
int sum(int a, int b)
{
return a + b;
}
函数的调用:
使用:函数(数据1,数据2…);
例如:sum(1, 2);
返回值会在函数执行完成后放置在调用位置,处理方式:
- 存储到变量中,长期使用。
- 立即使用,可以显示或参与运算。
函数之间参数的传递(值传递):
- 调用者向被调用者传递,由实参向形参传递。
-
不同函数的命名空间都是相互独立的,函数之间变量名可以重名,互不影响。同一函数中,不能定义相同名字的变量,但是同一个程序中全局变量名和函数中的局部变量名可以同名,但是此函数中暂不能引用同名全局变量。
-
函数在调用时,被调函数会为形参开辟新的内存空间,主函数中的实参会赋值给这个空间,形参是好比实参的一个副本。因此,在被调函数中,形参值的任何改变都不会影响实参值。在被调函数结束时,这段空间就会被回收,形参数据不复存在,而实参还是调用前的实参。
-
函数之间不能通过值传递来共享变量。
注意: 数组当作函数的参数时(在函数调用时的传递的数组会变成指针类型,此时就是引用传递了),长度会丢失,需要额外添加一个参数来传递它的长度。
-
#include <stdio.h>
void func(int arr[]) //其中,等价于 int* arr
{
for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
printf("%d\n",arr[i]); //运行结束后,只输出一个 1
}
int main()
{
int arr[5] = {1,2,3,4,5};
func(arr);
}
- 被调用者向调用者传递,使用return返回数据。
- 不写return语句也会有返回值。
- 调用者和被调用者会在内存中约定一个空间用于存储返回值,return语句的功能之一就是把一个数据存储到这个空间。如果不写return语句,调用者就会得到一个默认值(不确定)。
#include <stdio.h>
int func(void)
{
int arr[20] = {}; //如果注释此行,输出为1,不注释,输出为0。
}
int main()
{
int num = 9999;
num = func();
printf("%d\n",num);
}