rain_arch 发表于 2021-7-25 23:22:12

关于函数指针定义问题

本帖最后由 rain_arch 于 2021-7-25 23:24 编辑

使用函数指针定义后在赋值时出现错误,但在定义时赋值不会出现错误

出错的代码:

// 函数
int ponit_func(int *num1,int *num2)
{
    if(*num1>*num2)
      return *num1;
    else
      return *num2;
}
// 指针
int (*point_fn)(int* num1,int* num2) /*= &ponit_func*/;
point_fn = &ponit_func;
错误输出:

8.c:28:1: 警告:数据定义时没有类型或存储类
   28 | point_fn = &ponit_func;
      | ^~~~~~~~
8.c:28:1: 警告:在‘point_fn’的声明中,类型默认为‘int’ [-Wimplicit-int]
8.c:28:1: 错误:conflicting types for ‘point_fn’; have ‘int’
8.c:26:7: 附注:previous declaration of ‘point_fn’ with type ‘int (*)(int *, int *)’
   26 | int (*point_fn)(int* num1,int* num2) /*= &ponit_func*/;
      |       ^~~~~~~~
8.c:28:12: 警告:initialization of ‘int’ from ‘int (*)(int *, int *)’ makes integer from pointer without a cast [-Wint-conversion]
   28 | point_fn = &ponit_func;
      |            ^
8.c:28:12: 错误:初始值设定中的元素在载入时无法被计算出
8.c: 在函数‘main’中:
8.c:41:52: 错误:一元 ‘*’参数类型无效(有‘int’)
   41 |   printf("vlaue of ponit_func(int*,int*) is %d",(*point_fn)(&a,&b));
      |            

但是使用初始化就赋值是正确的
可以运行的代码:

int ponit_func(int *num1,int *num2)
{
    if(*num1>*num2)
      return *num1;
    else
      return *num2;
}
int (*point_fn)(int* num1,int* num2) = &ponit_func;

人造人 发表于 2021-7-25 23:36:44

// 函数
int ponit_func(int *num1,int *num2)
{
    if(*num1>*num2)
      return *num1;
    else
      return *num2;
}
// 指针
int (*point_fn)(int* num1,int* num2) /*= &ponit_func*/;
//point_fn = &ponit_func;

int main(void) {
    point_fn = &ponit_func;
}

rain_arch 发表于 2021-7-25 23:41:04

人造人 发表于 2021-7-25 23:36


为什在主函数之外就不可以呢

人造人 发表于 2021-7-25 23:50:14

rain_arch 发表于 2021-7-25 23:41
为什在主函数之外就不可以呢

函数外面的语句怎么执行?什么时候执行?
初始化的时候?什么初始化?局部变量初始化,全局变量初始化,你听过全局代码初始化?

人造人 发表于 2021-7-26 00:07:27

全局代码初始化
这么说确实不合适,因为没有这样的概念,我真编不出来
函数外面不能写语句

万千只cnm 发表于 2021-7-26 11:14:28

你只能在外面定义变量
语句都有代码块
页: [1]
查看完整版本: 关于函数指针定义问题