函数返回类型赋值给一个指针却报错?(语言-c语言)

img

各位能看看嘛?
我把返回结果(指针类型)赋值给相同类型的一个指针,报错显示:应输入表达式


```c
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>

typedef struct function
{
    char* func_name;
    void (*func_pointer)(void);


}function_list;

int add(int a, int b);
int add(int a, int b) {
    return a + b;
}



int compare(int a, int b);
int compare(int a, int b);
int compare(int a, int b) {
    return a > b ? a : b;
}


int equal(int a, int b);
int equal(int a, int b) {
    if (a == b)
        return 1;
    else 0;
}




int *find(char u, function_list *a) {
    
    while (strcmp(a->func_name,u)!=0)
    {
        *a++;

    }
    if (strcmp(a->func_name, u) != 0)
    {
        printf("未找到相关函数");
        return 0;
    }
    else
    {
        return a->func_pointer;
    }
    

}
int main() {
    
    int(*p)(int, int);
    p = add;
    int (*q)(int, int);
    q = compare;
    int(*r)(int, int);
    r = equal;

    function_list a[] = {
    {"add",*p},
    {"compare",*q},
    {"equal",*r}

    };


    char t;
    printf("input function name that you want:\n");
    scanf("%s", &t);
    int* i = find(t, a);
    


}


结构体 function_list 是怎么定义的?是否是这么改,供参考:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
typedef struct function
{
    char* func_name;
    int (*func_pointer)(int, int);   //修改
}function_list;

int add(int a, int b);
int add(int a, int b) {
    return a + b;
}

int compare(int a, int b);
int compare(int a, int b) {
    return a > b ? a : b;
}

int equal(int a, int b);
int equal(int a, int b) {
    if (a == b)
        return 1;
    else 
        return 0; //修改
}

int find(char* u, function_list* a, int n, int b, int c) //修改
{
    for (int i = 0; i < n; i++) {                  //修改
        if (strcmp((a + i)->func_name, u) == 0)    //修改
            return (a + i)->func_pointer(b, c);    //修改
    }
    return 0;
}

int main() 
{
    int n = 3;
    //int(*p)(int, int);  //修改
    //p = add;
    //int (*q)(int, int);
    //q = compare;
    //int(*r)(int, int);
    //r = equal;
    function_list a[3] = {                   //修改
                         {"add",add},        //修改
                         {"compare",compare},//修改
                         {"equal",equal}     //修改
    };
    char t[16];      //修改
    printf("input function name that you want:\n");
    scanf("%s", t);  //scanf("%s", &t); //修改
    int i = find(t, a, n, 5, 5);        //修改
    printf("%d", i);
    return 0;
}

把那个int * char function_list 的全部删除掉
int * i = find(t, a);
这么写就可以了。
你把函数的声明和调用搞混了。

find前面的int* 去掉,函数调用的时候不用加类型说明

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/226080
  • 你也可以参考下这篇文章:深入理解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)
        {
        }
    }
    

    截个图看的更清楚一点

    串口打印结果:

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


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^