外观
C 语言入门(六)
前言
欢迎,欢迎,今天迎来的是 “函数” 大神😇
六、函数简介
6.1 函数声明
类似于数学中的 “函数”,有输入,输出和对应法则🧐
函数是一段可以重复执行的代码。它可以接受参数,完成对应的操作。
c
int plus(int a,int b) {
return a + b;
}
// 函数的调用(函数必须声明后使用,否则会报错)
int a = plus_one(3,4);
函数的声明
int
:返回值类型,函数声明前需要给出返回值的类型。plus
:自定义函数名,遵循命名规范。int a
:声明参数的类型和参数名,可以有多个参数。return
:给出函数的返回值后,就会结束函数的调用。如果函数没有返回值,可以省略return
语句,或者写成return;
。
viod
关键字
常用在函数语句哦😮
void 关键字C语言中,主要用于表示“无类型”或“无返回值”。
c
void myFunc(void) {
// ...
}
扩展
递归
可以想象你前后都有一面镜子,看向其中一面,你就会发现镜中无限“递归”🧐
递归指的是在函数的定义中使用函数自身的方法。
c
// 斐波那契数列
unsigned long Fibonacci(unsigned n) {
if (n > 2)
return Fibonacci(n - 1) + Fibonacci(n - 2);
else
return 1;
}
6.2 函数的参数
c
int plus(int a,int b) {
return a + b;
}
// 函数的调用(函数必须声明后使用,否则会报错)
int a = plus_one(3,4);
- 形参:形参是函数定义时的参数,它们在函数体内用作占位符。其作用是接收调用函数时传入的实际参数。例如
a
。 - 实参:实参是函数调用时传递给函数的具体值或变量。实参的值会被传递给形参。例如
3
。
参数传递方式
水了,水了😋
c
#include <stdio.h>
// 交换函数
void swap(int* varA, int* varB) {
int tmp = *varA;
*varA = *varB;
*varB = tmp;
}
int main() {
int varA = 5;
int varB = 10;
int* varAp = &varA;
int* varBp = &varB;
swap(varAp, varBp);
printf("varA的值是%d\n", varA);
printf("varB的值是%d\n", varB);
return 0;
}
/* >>
varA的值是10
varB的值是5
*/
哎嘿,成了!😃
没有“指针之神”的加持之力,swap
函数是值传递,值传递在调用函数时,将实参的值复制给形参,在函数内部对参数的修改不会影响实际参数。你可以这样想,你把房产证复印件给了别人,别人将此改了名,那么房产证的名是真的改了吗?🤔
在“指针之神”的加持之力下,swap
是引用传递,引用传递在调用函数时,将实参的地址传递给形参,在函数内部对参数的修改会影响实际参数。你可以这样想,你把房产证给了别人,别人将此改了名,那么这回房产证的名是真的改了吧。😮
可变参数
了解即可,写普通代码也是很少用了🤔
有些时候,函数的参数数量是不确定的,可以使用省略号...
表示可变数量的参数。
c
int myFun (int a, ...);
6.3 入口函数
别打成
mian()
就行😒
C 语言规定,main()
函数是程序的入口函数
所有的程序一定要包含一个
main()
函数。程序总是从这个函数开始执行,如果没有,该程序就无法启动。
其他函数都是通过它引入程序的。
c
int main(void)
{
printf("Hello World\n");
return 0; //可忽略(建议写上)
}
//return 0; 表示函数结束运行,返回 0
//C 语言约定,返回值 0 表示函数运行成功,如果返回其他非零整数,就表示运行失败
函数原型
“函数必须先声明,后使用”,那就是说必须在
main()
函数前声明呗?🤔
因为程序会先运行main()
函数,所以其他函数都必须在main()
函数之前声明。否则编译时会产生警告。也可以在程序开头处给出函数原型,函数就可以先使用、后声明。
所谓函数原型,就是提前告诉编译器,每个函数的返回类型和参数类型。具体的函数实现可以后面再补上。
c
int plus(int a,int b);
int main(int num) {
return plus(3, 4);
}
int plus(int a,int b) {
return a + b;
}
6.4 函数指针
函数指针
函数指针是指向函数的指针变量。函数指针可以像一般函数一样,用于调用函数、传递参数。
TIP
一般 C 语言中的函数指针不会单独使用,而会作为回调函数使用,允许将函数作为参数传递给其他函数。
c
#include <stdio.h>
int max(int x, int y) {
return x > y ? x : y;
}
int main(void) {
/* p 是函数指针 */
int (* p)(int, int) = & max; // &可以省略
int a = 1, b = 2, c = 3, d;
/* 与直接调用函数等价,d = max(max(a, b), c) */
d = p(p(a, b), c);
printf("最大的数字是: %d\n", d);
return 0;
}
写在最后
如果一段代码重复使用且逻辑完整建议拆分成函数🤔
函数算是以上文章的“结合体”了,你可以在函数中写变量、运算或控制流。函数是一个程序的“子体”,一起组成了一个完整的程序。