为什么形参(void (*p)(char *))是常量?

题目描述

用一个回调函数,打印出 str 的内容

题目来源及自己的思路

来源:鹏哥c语言
图片.png

相关代码

#include<stdio.h>
void print(char *str)
{
    printf("hehe%s",str);
}
void test(void(*p)(char*))
{
    printf("test\n");
    p("abcdefg");
}
int main()
{
    test(print);
    //调用test函数,参数是print函数
    return 0;
}

你期待的结果是什么?实际看到的错误信息又是什么?

按道理来说,应该是通过 test 函数调用 print 函数,打印出来 heheabcdefg,但实际会报错

const char * 类型的实参与 char * 类型的形参不兼容;
阅读 2.8k
3 个回答

你理解错了,这个错误说的是 "abcdefg" 是 const char*,而你的 p 函数定义的是接收 char*,所以才报错,你需要改成:

#include<stdio.h>
void print(const char *str)
{
    printf("hehe%s",str);
}
void test(void(*p)(const char*))
{
    printf("test\n");
    p("abcdefg");
}
int main()
{
    test(print);
    //调用test函数,参数是print函数
    return 0;
}

就可以了。

新手上路,请多包涵

是void(char*)类型的函数指针

新手上路,请多包涵

实参类型是const char ,形参类型是char ,两者类型不匹配,所以报错。我们可以将实参类型改为和形参一致,也就将p("abcdefg");改为char arr[]="abcdefg"; p(arr); arr是char 类型。与形参类型就一致了。或者是将print函数的形参类型改为const char ,与实参类型一致,也就是void print(const char *str){printf(hehe%s",str);}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题