1. C语言函数的定义和调用
C语言中的函数是指一个完成特定任务的代码块,在程序中被定义一次,之后可以被多次调用执行。函数需要在程序中被定义才能使用,一般定义的方式如下:
返回类型 函数名(参数列表) {
函数体
return 返回值;
}
其中,返回类型表示函数返回值的数据类型,函数名是函数的标识符,参数列表是函数的参数列表,用括号括起来,多个参数之间用逗号分隔,函数体是函数实际执行的代码。函数可以有返回值,也可以没有返回值,有返回值的函数需要在函数体内使用return语句将计算结果返回给调用者。函数调用的方式为:
函数名(参数列表);
1.1 无参函数的定义和调用
无参函数是指不需要传递参数的函数,定义方式如下:
void function_name() {
函数体
}
其中,void表示该函数没有返回值。调用方式如下:
function_name();
1.2 有参函数的定义和调用
有参函数是指需要传递参数的函数,定义方式如下:
返回类型 function_name(参数类型1 参数名1, 参数类型2 参数名2, ...) {
函数体
return 返回值;
}
其中,参数类型表示参数的数据类型,参数名表示参数的名称。调用方式如下:
function_name(参数值1, 参数值2, ...);
2. C语言函数的参数传递方式
C语言函数的参数传递方式有值传递和指针传递两种方式。
2.1 值传递
值传递是指将实参的值复制一份传递给函数,函数对该值的修改不会影响到实参的值。值传递的方式适用于传递简单的数据类型和小的数据结构。例如:
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 1, y = 2;
swap(x, y);
printf("x = %d, y = %d", x, y);
}
上面的代码输出结果为x = 1, y = 2,因为swap函数内部交换的是a和b的值,而不是x和y的值。
2.2 指针传递
指针传递是指将实参的地址传递给函数,在函数内部通过指针访问实参的值,函数对该值的修改会影响到实参的值。指针传递的方式适用于传递复杂的数据类型和大的数据结构。例如:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 1, y = 2;
swap(&x, &y);
printf("x = %d, y = %d", x, y);
}
上面的代码输出结果为x = 2, y = 1,因为swap函数内部交换的是a和b所指向的变量的值,而不是a和b的值。
3. C语言函数的递归调用
递归是指函数调用自身的过程。递归调用可以解决一些问题,如计算n的阶乘、斐波那契数列等问题。
3.1 计算n的阶乘
int factorial(int n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factorial(n-1);
}
}
int main() {
int n = 5;
int result = factorial(n);
printf("%d! = %d", n, result);
}
上面的代码输出结果为5! = 120,因为factorial函数计算n的阶乘的过程中调用了自身。
3.2 斐波那契数列
int fibonacci(int n) {
if (n == 1 || n == 2) {
return 1;
} else {
return fibonacci(n-1) + fibonacci(n-2);
}
}
int main() {
int n = 10;
int result = fibonacci(n);
printf("斐波那契数列的第%d项是%d", n, result);
}
上面的代码输出结果为斐波那契数列的第10项是55,因为fibonacci函数计算斐波那契数列的过程中调用了自身。