c语言开发笔记五:函数

目录

1 函数是什么?

2 函数的语法

2.1 函数的三部分

2.2 函数的实参

2.3 函数的形参

2.3 函数的返回值

3 函数的五个原则

4 函数中的参数

4.1 值传递

4.2 地址传递

4.3 传递数组

5 函数的递归调用


  • 个人主页:linux_嵌入式大师之路的博客-CSDN博客
  • 欢迎 点赞✍评论⭐收藏
  • 希望本文能对你有所帮助,欢迎在评论区交流讨论!

1 函数是什么?

函数为指令的集合,函数名为这些指令的入口地址。

2 函数的语法

2.1 函数的三部分

  • 函数声明
  • 函数定义
  • 函数调用

函数返回值类型 函数名 (参数表)
{
    函数体;
}

void  fun(int a)
{
    a = 1;
}

实参的类型和顺序与函数的形参需要匹配,在函数声明或定义中,函数的形参是函数用于接收实参值的占位符。在函数调用时,实参的类型和顺序应与函数声明或定义中形参的类型和顺序相匹配。

函数支持嵌套使用。

2.2 函数的实参

函数的实参是在函数调用时传递给函数的值。实参可以是常量、变量、表达式或其他函数的返回值。函数使用这些实参来执行特定的操作或计算,并返回一个值(如果有必要)。

2.3 函数的形参

函数的形参是在函数定义中声明的变量,用于接收函数调用时传递的实参,可以在函数内部使用。

函数的形参有以下特点:

  • 形参的声明位于函数的定义中的括号内,以逗号分隔。例如:int add(int a, int b)
  • 形参允许在函数内部使用,并且可以像任何其他变量一样进行操作。
  • 形参充当了函数内使用的局部变量,其作用域仅限于函数内部。
  • 在函数调用时,实参的值被传递给形参。实参可以是常量、变量、表达式或其他函数的返回值。
  • 形参的值在函数执行过程中可以更改,但不会影响到函数外部的变量。

2.3 函数的返回值

函数的返回值是指函数执行完毕后将要返回给调用者的值。函数只能有一个返回值,该值可以是任何合法的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;
}

3 函数的五个原则

  • 有函数类型,则一定有返回值,否则没有
  • 有参数,就一定有值的传递
  • 函数只有在调用时才分配空间,调用完成马上释放
  • 函数最好不要与其他函数或者全局变量有关联,要保持函数的干净,函数功能的专一,不能三心二意。
  • 函数定义要在函数使用之前,否则要提前进行函数声明

4 函数中的参数

4.1 值传递

函数调用时,实参的值会被赋值给到函数的形参。函数在执行时仅对形参进行操作,不会影响到实参的值。

4.2 地址传递

通过传递指针作为实参,可以将变量的地址传递给函数,此时实参和形参指向同一块地址,对形参指针指向的内容进行修改,函数实参指向的内容也会发生变化

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,实参指向的变量值未发生改变;

4.3 传递数组

数组名实际上是指向数组的指针。因此,可以通过使用指针传递数组的实参来访问和修改数组的元素,和上述指针的使用方法一样,需要注意的是,需要把数组的长度传递进来,避免指针越界访问

// 函数接受一个整数数组和数组长度,并计算数组元素的和
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;
}

5 函数的递归调用

递归是一种函数调用自身的过程。使用递归来解决某些问题,特别是那些可以分解为相同类型的子问题的问题。递归函数通常包含两个部分:终止和递归。

  • 终止是指递归函数可以直接解决的问题,而不需要再次调用自身。这是递归函数的终止条件,防止函数无限地调用下去。
  • 递归是指递归函数需要调用自身解决的问题。在递归情况下,问题被分解为更小的子问题,每次调用递归函数时,问题规模都会减小,直到达到终止。

示例演示如何使用递归来计算一个正整数的阶乘:

#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语言学习笔记今天就分享到这里啦!希望各位多多点赞收藏评论!!! 

你可能感兴趣的:(c/c++,c++,c语言,嵌入式硬件)