【问题标题】:Why the function pointer pointing to different function works than it is defined为什么指向不同函数的函数指针比定义的更有效
【发布时间】:2013-09-16 02:39:45
【问题描述】:

在下面的程序中,函数指针被定义为指向一个不接受参数并返回 int 的函数,但函数指针在这里工作。为什么?

#include<stdio.h>

int mul(int*,int*);

int main()
{   int a=10,b=20;
    int(*p)();
    p=&mul;
    printf("%d ", (*p)(&a,&b));
        return 0;
}


int mul(int*a,int*b)
{   
    return (*a * *b);
}

【问题讨论】:

  • 函数ret_type name() 对参数数量没有任何限制。 ret_type name(void) 是声明不带任何参数的函数的正确方法。
  • "int(*p)()" 不是指向返回 void 的函数的指针。 "void(*p)()" 是。
  • 哦,我更正了这个问题。实际上返回类型是int。只需解释为什么函数指针在这里起作用。
  • void main() 是错误的。 int main(void) 是正确的。 (这不是完全 100% 正确;void main() 对于某些嵌入式系统可能是正确的,但 99% 肯定这不适用于您。)我很想知道您在哪里知道void main() 是有效的。您可能正在使用一本不太懂 C 的人写的书,我希望能够警告人们远离它。
  • @KeithThompson,多余的 cmets 没有帮助。

标签: c pointers


【解决方案1】:

在 C 中,int (*p)() 表示声明一个指向函数的指针,该函数接受 未指定 个参数并返回 int。由于未指定参数的数量,因此将指向函数int mul(int *a, int *b) 的指针分配给变量p有效

如果将声明更改为int (*p)(void),这意味着声明一个指向函数的指针,该函数接受无参数并返回int,那么编译器很可能会抛出关于指针不兼容的警告类型。对于 gcc,默认级别的警告会引发警告。

正如 Keith Thompson 在评论中提到的,您应该始终使用原型,即指定参数类型的声明。在这种情况下,它将是:

int (*p)(int*, int*);

参考

【讨论】:

  • 和带有空括号的函数声明,不指定参数类型的数量,是过时的。您应该始终使用原型,即指定参数类型的声明。
  • @KeithThompson:TBH,我不会在 C 中正确编写任何代码。如果您不介意,请您写一个答案(或编辑我的答案)到分享编码实践?
  • 感谢您的回答。
  • @JackCColeman:N1570 6.2.1p2:“函数原型是声明其参数类型的函数的声明。)”。 N1570 6.9.1p7:“函数定义中的声明符指定被定义函数的名称及其参数的标识符。如果声明符包含参数类型列表,则该列表还指定所有参数的类型;这样的声明符还用作函数原型,以便以后在同一个翻译单元中调用同一个函数。” (我不知道你为什么认为那“臭”。)
  • 如果声明器没有参数列表,那么它就不能作为原型。如果函数没有参数,那么它应该(void) 定义,它确实用作原型。我的意思不是要记住规范,我只是向您解释原型是什么。
猜你喜欢
  • 1970-01-01
  • 2012-08-13
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
相关资源
最近更新 更多