这个错误是什么意思? “void”类型的参数与“void (*)(int a)”类型的参数不兼容

问题描述

我正在尝试使用函数指针来调用一个函数,但它给了我一个错误。我不明白错误

这是我的代码

#include<stdio.h>
#include<stdlib.h>

void print(void (*ptr)(int));
void printint(int);

int main()
{
    char a;
    int b;
    scanf("%c %d",&a,&b);
    print(printint(b));
    return 0;
} 

void print(void (*ptr)(int a))
{
    ptr(a);
}

void printint(int a)
{
    // printf("executed");
    printf("%d",a);
}

我想我错误地使用了函数指针。有人能解释一下如何以正确的方式实现这个程序吗?

解决方法

问题是 print(printint(b)); 首先调用 printint(b),然后将其返回值(即 void)传递给print()。因此出现错误。

您需要在单独的参数中将b的值传递给print(),然后它才能将值传递给printint(),例如:

#include <stdio.h>
#include <stdlib.h>

typedef void (*funcptr)(int);

void print(funcptr,int);
void printint(int);

int main()
{
    char a;
    int b;
    scanf("%c %d",&a,&b);
    print(printint,b);
    return 0;
} 

void print(funcptr ptr,int a)
{
    ptr(a);
}

void printint(int a)
{
    // printf("executed");
    printf("%d",a);
}
,

表达式printint(b)的类型为void,根据函数printint声明:

void printint(int);

因此,您不是传递函数指针,而是在此调用中传递 void

print(printint(b));

函数 print 应该这样声明:

void print( void (*ptr)(int),int );

并像这样调用:

print( printint,b );

相应地,函数应该这样定义:

void print( void (*ptr)(int ),int a )
{
    ptr(a);
}