目录
1 函数是什么?
2 函数的语法
2.1 函数的三部分
2.2 函数的实参
2.3 函数的形参
2.3 函数的返回值
3 函数的五个原则
4 函数中的参数
4.1 值传递
4.2 地址传递
4.3 传递数组
5 函数的递归调用
函数为指令的集合,函数名为这些指令的入口地址。
- 函数声明
- 函数定义
- 函数调用
函数返回值类型 函数名 (参数表)
{
函数体;
}void fun(int a)
{
a = 1;
}
实参的类型和顺序与函数的形参需要匹配,在函数声明或定义中,函数的形参是函数用于接收实参值的占位符。在函数调用时,实参的类型和顺序应与函数声明或定义中形参的类型和顺序相匹配。
函数支持嵌套使用。
函数的实参是在函数调用时传递给函数的值。实参可以是常量、变量、表达式或其他函数的返回值。函数使用这些实参来执行特定的操作或计算,并返回一个值(如果有必要)。
函数的形参是在函数定义中声明的变量,用于接收函数调用时传递的实参,可以在函数内部使用。
函数的形参有以下特点:
- 形参的声明位于函数的定义中的括号内,以逗号分隔。例如:int add(int a, int b)
- 形参允许在函数内部使用,并且可以像任何其他变量一样进行操作。
- 形参充当了函数内使用的局部变量,其作用域仅限于函数内部。
- 在函数调用时,实参的值被传递给形参。实参可以是常量、变量、表达式或其他函数的返回值。
- 形参的值在函数执行过程中可以更改,但不会影响到函数外部的变量。
函数的返回值是指函数执行完毕后将要返回给调用者的值。函数只能有一个返回值,该值可以是任何合法的C数据类型,如整数、浮点数、字符或指针等。如果需要返回多个值,可以使用指针或结构体等方式来实现;如果不需要返回任何值,则返回类型可以定义为void类型
示例:声明一个函数,接受两个整数参数,并返回它们的和(返回类型为整型)
int add(int a, int b)
{
return a + b;
}
int main() {
int num1 = 5;
int num2 = 10;
int result;
// 调用add函数,并将num1和num2作为实参传递
result = add(num1, num2);
printf("The sum is: %d\n", result);
return 0;
}
- 有函数类型,则一定有返回值,否则没有
- 有参数,就一定有值的传递
- 函数只有在调用时才分配空间,调用完成马上释放
- 函数最好不要与其他函数或者全局变量有关联,要保持函数的干净,函数功能的专一,不能三心二意。
- 函数定义要在函数使用之前,否则要提前进行函数声明
函数调用时,实参的值会被赋值给到函数的形参。函数在执行时仅对形参进行操作,不会影响到实参的值。
通过传递指针作为实参,可以将变量的地址传递给函数,此时实参和形参指向同一块地址,对形参指针指向的内容进行修改,函数实参指向的内容也会发生变化
void fun1(int *p)
{
*p = 2;
}
main()
{
int *p;
int a = 1;
p = &a;
fun1(p);
}
调用返回后a=2;
注意不能对指针进行赋值,对指针进行赋值是改变了形参的指向,此时实参和形参不再指向同一块地址,对形参指向的内容进行操作,实参的值不会发生改变
void fun1(int *p)
{
int b = 1;
int *ptr = &b;
p = ptr;
*p = 2;
}
main()
{
int *p;
int a = 1;
p = &a;
fun1(p);
}
调用返回后a=1,实参指向的变量值未发生改变;
数组名实际上是指向数组的指针。因此,可以通过使用指针传递数组的实参来访问和修改数组的元素,和上述指针的使用方法一样,需要注意的是,需要把数组的长度传递进来,避免指针越界访问
// 函数接受一个整数数组和数组长度,并计算数组元素的和
int calculateSum(int *arr, int length)
{
int sum = 0;
for (int i = 0; i < length; i++)
{
sum += arr[i];
}
return sum;
}
int main()
{
int numbers[] = {1, 2, 3, 4, 5};
// 调用calculateSum函数,将数组名作为实参传递给函数
int totalSum = calculateSum(numbers, sizeof(numbers) / sizeof(numbers[0]));
printf("数组元素之和为:%d\n", totalSum);
return 0;
}
递归是一种函数调用自身的过程。使用递归来解决某些问题,特别是那些可以分解为相同类型的子问题的问题。递归函数通常包含两个部分:终止和递归。
- 终止是指递归函数可以直接解决的问题,而不需要再次调用自身。这是递归函数的终止条件,防止函数无限地调用下去。
- 递归是指递归函数需要调用自身解决的问题。在递归情况下,问题被分解为更小的子问题,每次调用递归函数时,问题规模都会减小,直到达到终止。
示例演示如何使用递归来计算一个正整数的阶乘:
#include
int factorial(int n) {
// 终止:n为0或1时,直接返回1
if (n == 0 || n == 1)
{
return 1;
}
// 递归:调用自身计算n的阶乘,并返回结果
return n * factorial(n - 1);
}
int main() {
int num;
printf("请输入一个正整数:");
scanf("%d", &num);
int result = factorial(num);
printf("%d的阶乘为:%d\n", num, result);
return 0;
}
C语言学习笔记今天就分享到这里啦!希望各位多多点赞收藏评论!!!