问题:关于C语言中的函数参数问题

img


这个的函数的参数只有一个?是哪一个呢?对这方面的知识点并未掌握好,求详细解答

在C语言中,函数的参数应该用逗号分隔,并且在括号内。对于你给出的例子 fun((((1,2),3),4));,这实际上是一个利用了逗号运算符的表达式。

逗号运算符 , 会按照从左到右的顺序计算其操作数,并返回最后一个操作数的值。所以 (((1,2),3),4) 这个表达式的结果将是4。

因此,你这个函数调用 fun((((1,2),3),4)); 的参数就是整数4。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7803220
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:【C语言】编写一个函数,实现两个数的交换 详细解答
  • 你还可以看下c语言参考手册中的 c语言-内存模型与数据竞争
  • 除此之外, 这篇博客: 这是我看过最全面讲解嵌入式C语言回调函数和函数指针的教程中的 一、函数指针 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 函数指针,顾名思义它就是一个指针,只不过它是一个函数指针,所以指向的是一个函数。类比一般的变量指针,指针变量,实质上是一个变量,只不过这个变量存放的是一个地址,在32位单片机中,任何类型的指针变量都存放的是一个大小为4字节的地址。

    
    int   a; < = > void cal_sum(void);
    int * p; < = > void (*func_ptr)(void);
    p=&a;   < = > func_ptr= &cal_sum;
    

    左边走义变量a,右边定义函数cal_sum;

    左边定义int指针,右边定义func_ptr;

    左边赋值指针,右边赋值函数指针;

    可能这样大家还是不太清楚,我是搞嵌入式单片机的,有本事你在Keil中给我举一个例子啊?

    可以啊,没问题,请看!

    #include "sys.h"
    #include "led.h"
    #include "delay.h"
    #include "usart.h"
    
    uint8_t cal_sum(uint8_t a, uint8_t b)
    {
        return a + b;
    }
    
    int main(void)
    {
        delay_init();
        uart_init(9600);
    
        printf("www.zhiguoxin.cn\r\n");
        printf("微信公众号:果果小师弟\r\n");
    
        uint8_t a = 10;
        uint8_t b = 8;
    
        /*定义一个函数指针*/
        uint8_t (*func_ptr)(uint8_t, uint8_t);
        /*将函数名赋值给函数指针*/
        func_ptr = cal_sum;
    
        printf("cal_sum_address  =0x%p\r\n", cal_sum);
        printf("func_ptr_address =0x%p\r\n", func_ptr);
        printf("%d + %d = %d\r\n", a, b, cal_sum(a, b));
        printf("%d + %d = %d\r\n", a, b, func_ptr(a, b));
    
        while(1)
        {
        }
    }
    

    这样写大家应该很熟悉吧,我首先定义了一个函数指针func_ptr,接着将我写得cal_sum函数赋值给了函数指针func_ptr 。然后分别打印函数cal_sum的地址,函数指针func_ptr的地址,以及使用cal_sum计算出来的值,和函数值指针func_ptr计算出来的值。

    那么结果是啥样呢?

    可以发现函数指针func_ptrcal_sum函数的存储的地址以及他们所计算出来的值是一样的。

    比如在上面求两个数和的基础上再求两个数的乘积和差,会是啥样的呢?

    代码是这样的

    #include "sys.h"
    #include "led.h"
    #include "delay.h"
    #include "usart.h"
    
    uint8_t cal_sum(uint8_t a, uint8_t b)
    {
        return a + b;
    }
    
    uint8_t cal_sub(uint8_t a, uint8_t b)
    {
        return a - b;
    }
    
    uint8_t cal_mul(uint8_t a, uint8_t b)
    {
        return a * b;
    }
    
    int main(void)
    {
        delay_init();
        uart_init(9600);
    
        printf("www.zhiguoxin.cn\r\n");
        printf("微信公众号:果果小师弟\r\n");
    
        uint8_t a = 10;
        uint8_t b = 8;
    
        /*定义一个函数指针*/
        uint8_t (*func_ptr)(uint8_t, uint8_t);
        /*将函数名赋值给函数指针*/
        func_ptr = cal_sum;
    
        printf("cal_sum_address  =0x%p\r\n", cal_sum);
        printf("func_ptr_address =0x%p\r\n", func_ptr);
        printf("%d + %d = %d\r\n", a, b, cal_sum(a, b));
        printf("%d + %d = %d\r\n\n", a, b, func_ptr(a, b));
    
        /*将函数名赋值给函数指针*/
        func_ptr = cal_sub;
    
        printf("cal_sub_address  =0x%p\r\n", cal_sub);
        printf("func_ptr_address =0x%p\r\n", func_ptr);
        printf("%d - %d = %d\r\n", a, b, cal_sub(a, b));
        printf("%d - %d = %d\r\n\n", a, b, func_ptr(a, b));
    
        /*将函数名赋值给函数指针*/
        func_ptr = cal_mul;
    
        printf("cal_mul_address  =0x%p\r\n", cal_mul);
        printf("func_ptr_address =0x%p\r\n", func_ptr);
        printf("%d * %d = %d\r\n", a, b, cal_mul(a, b));
        printf("%d * %d = %d\r\n", a, b, func_ptr(a, b));
    
        while(1)
        {
        }
    }
    

    截个图看的更清楚一点

    串口打印结果:

    指向函数的指针被称作是函数指针。通过函数指针,我们可以灵活的调用各种形式相同,但是功能不同的函数这样做大大的增加了代码的灵活程度。

  • 您还可以看一下 徐家乾老师的极简C语言入门课程课程中的 解决实际问题的程序设计方法小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    在C语言中函数的参数为传递给函数的外部数据,可以是变量、常量或表达式。函数参数的数量可以是0个、1个、多个。在函数声明和函数定义中,需要指定每个参数的类型。

    下面举例说明:

    1. 0个参数的函数:
    void print_hello(void)
    {
        printf("Hello!");
    }
    
    int main()
    {
        print_hello(); //调用函数
        return 0;
    }
    
    1. 1个参数的函数:
    int square(int num)
    {
        return num * num;
    }
    
    int main()
    {
        int x = 5;
        int result = square(x); //调用函数并接收返回值
        printf("%d的平方是%d", x, result);
        return 0;
    }
    
    1. 多个参数的函数:
    int add(int a, int b)
    {
        return a + b;
    }
    
    int main()
    {
        int x = 5, y = 3;
        int result = add(x, y); //调用函数并接收返回值
        printf("%d加%d等于%d", x, y, result);
        return 0;
    }