跳转至

函数

函数的定义

数据类型 函数名([数据类型 形参名,数据类型 形参名,...... ])

函数的传参

  • 主函数参数

    int main(int argc, int* argv[])
    {
        // argc 作为计数器,记录传递的参数个数
        // argv 是一个列表,记录了所有的参数,argv的个数由argc决定,最后还会有NULL作为结束。
    
        return 0;
    }
    

  • 值传递

  • 地址传递

函数的返回值

  • 主函数返回值

    // 在没有 return 0; 时,返回值为 int,此时以 printf 的返回值作为 main 函数的返回值
    int main(void)
    {
        printf("Hello!\n");
    }
    

  • 函数的返回值是给其父进程看的,谁创建它谁就是它的父进程。

  • 某一个函数未包含头文件,那么编译器会认为它返回int。必须正确包含头文件。

函数的调用

  • 函数调用是压栈和弹栈(嵌套调用、递归调用)

函数与数组

  • 函数传递一维数组的地址,并不知道该数组的长度,应当再传递int size;

    void print_arr(int* p, int size);
    
    // int p[]作为形参是指针,作为定义是数组。
    void print_arr(int p[], int size);
    

  • 函数传递二维数组的地址,并不知道该数组的长度,应当再传递n行,m列;

    #include <stdio.h>
    
    // void print_arr(int p[][3], int n, int m)
    void print_arr(int(*p)[3], int n, int m)
    {
        int i = 0, j = 0;
        for (i = 0; i < n; i += 1)
        {
            for (j = 0; j < m; j += 1)
            {
                printf("%4d", *(*(p + i) + j));
            }
            printf("\n");
        }
    
        return ;
    }
    
    int main(void)
    {
        int arr[3][3] = { 1, 2, 3 };
        print_arr(arr, 3, 3);
    
        return 0;
    }
    

函数与指针

  • 指针函数:返回值为指针的函数。

    int* find_num(int(*p)[N], int num);
    

  • 函数指针:指向函数的指针。

    #include "tools.h"
    
    int add(int a, int b)
    {
        return a + b;
    }
    
    void print(int n)
    {
        printf("%d\n", n);
        return ;
    }
    
    int main()
    {
        int(*p)(int, int) = add;
        void(*q)(int) = print;
    
        printf("%d\n", p(1, 2));
        q(5);
    
        return 0;
    }
    

  • 抽象一个函数类型(构建回调函数)

    typedef void print_node_data(const void *);
    void (*op)(const void *);    /* 等价的函数指针 */
    
    /* 以函数指针构建一个回调函数 */
    void list_display(Head *handler, print_node_data *op);
    void list_display(Head *handler, void (*op)(const void *));
    

  • 函数指针数组:数组的每一个元素(函数指针)指向函数。

    #include "tools.h"
    
    #define N 3
    
    int add(int a, int b)
    {
        return a + b;
    }
    
    int main(void)
    {
        // 函数指针数组
        int(*funcarr[N])(int, int) = { add, add, add };
        int i = 0;
    
        for (i = 0; i < N; i += 1)
        {
            printf("%p -> RUN FUNC: %d\t", funcarr + i, (*(funcarr + 1))(5, 6));
    
            // 或
            printf("%p -> RUN FUNC: %d\n", funcarr + i, funcarr[i](5, 6));
        }
    
        return 0;
    }
    

  • 示例:指向指针函数的函数指针数组

    int*(*funcarr[N])(int);