C语言中的函数
函数的"地位"
C语言:以函数为主体
别称:
-
"代码块"
-
"工具"
每一个具体的功能,都可以写成一个函数
自定义函数
语法格式
返回值类型 函数名(形参表) // 函数头
{
函数体;
return 返回值;
}
解释
返回值类型: 反馈 可以没有,可以为空(void)
函数名: 合法标识符(一般都是动词)
形参表: 规定参数格式(可以为空) (类型1 参数名1,类型2 参数2,....类型n 参数n)
函数体: 代码(逻辑)
返回值: C语言中 函数只允许最多一个返回值
例子:
// 形参表: (类型1 参数名1,类型2 参数2,....类型n 参数n)
int add(int x, int y)
{
int n;
n = x + y;
return n;
}
int jian(int x, int y)
{
int n;
n = x - y;
return n;
}
void eat()
{
printf("鸡汤来喽!!!\n");
}
函数调用
函数名(实参表)
实参表: 实际的参数
调用流程
-
从主调函数进入被调函数
-
系统给形参分配临时内存,将实参的值拷贝给形参 ==> 函数定义时 形参没有内存
-
进入被调函数,执行函数体
-
系统回收临时内存
-
回到主调函数,有返回值的,带回返回值
用法
-
可以作为一个独立语句
-
如果有返回值 可以做右值
-
可以直接用于打印
-
有返回值的 可以做实参 (链式操作)
-
可以作为判断条件
-
.....
#include <stdio.h>
// 形参表: (类型1 参数名1,类型2 参数2,....类型n 参数n)
int add(int x, int y)
{
int n;
n = x + y;
return n;
}
int jian(int x, int y)
{
int n;
n = x - y;
return n;
}
void eat()
{
printf("鸡汤来喽!!!\n");
}
int main()
{
eat();
int num = add(3, 4);
printf("num = %d\n", num);
printf("%d\n", add(3, 4));
add(3, add(1, 2));
if (add(5,6) > 10)
{
printf(">10\n");
}
return 0;
}
函数声明
返回值类型 函数名(形参表);
当函数的定义在调用之后,需要在调用之前,对函数进行声明
数组元素作为函数参数
#include <stdio.h>
/* 函数声明 */
int getMax(int x, int y);
int main()
{
// 1 定义一个数组
int arr[5] = { 1, 2, 14, 5, 9 };
int max = -1;
// 3 得到数组元素的最大值
for (size_t i = 0; i < 5; i++)
{
max = getMax(max, arr[i]);
}
printf("max = %d\n", max);
return 0;
}
/* 函数定义 */
// 2 比较两个数的大小
int getMax(int x, int y)
{
if (x > y)
return x;
return y;
}
数组作为函数的参数
可以不指定长度
数组名会"弱化"为指针
#include <stdio.h>
/* 函数声明 */
void function(int a[], int length);
int main()
{
int arr[5] = { 1, 2, 14, 5, 9 };
function(arr, 5);
return 0;
}
/* 函数定义 */
void function(int a[],int length)
{
for (size_t i = 0; i < length; i++)
{
printf("a[%d]: %d\n", i, a[i]);
}
}
/*
现象: sizeof(a)/sizeof(a[0]) ==> 1
原因: 这里的a 看似是数组名实际上不是的
描述: 数组名做函数参数时会"弱化"为指针
*/
二维数组作为函数的参数
行数可以不指定 但是列数必须指定
#include <stdio.h>
/* 函数声明 */
void fun1(int a[3][4]);
void fun2(int a[][4]);
int main()
{
int map[3][4] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
};
fun1(map);
printf("***************\n");
fun2(map);
return 0;
}
/* 函数定义 */
void fun1(int a[3][4])
{
for (size_t i = 0; i < 3; i++)
{
for (size_t j = 0; j < 4; j++)
{
printf("%3d", a[i][j]);
}
printf("\n");
}
}
void fun2(int a[][4])
{
for (size_t i = 0; i < 3; i++)
{
for (size_t j = 0; j < 4; j++)
{
printf("%3d", a[i][j]);
}
printf("\n");
}
}