各位能看看嘛?
我把返回结果(指针类型)赋值给相同类型的一个指针,报错显示:应输入表达式
```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* 去掉,函数调用的时候不用加类型说明
不知道你这个问题是否已经解决, 如果还没有解决的话:函数指针,顾名思义它就是一个指针,只不过它是一个函数指针,所以指向的是一个函数。类比一般的变量指针,指针变量,实质上是一个变量,只不过这个变量存放的是一个地址,在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_ptr
和cal_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)
{
}
}
截个图看的更清楚一点
串口打印结果:
指向函数的指针被称作是函数指针。通过函数指针,我们可以灵活的调用各种形式相同,但是功能不同的函数这样做大大的增加了代码的灵活程度。