关于Pointers To函数声明中的函数

dra*_*fly 23 c c++ pointers function-pointers function

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

int fun1()
{
    printf("I am fun1.");
    return 0;
}

int fun2(int fun())
{
    fun();
    return 0;
}

int main()
{
    fun2(fun1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的程序可以运行.就我而言,我能理解int fun2(int (*fun)()),但我不知道它是如何int fun2(int fun())运作的.谢谢.

Naw*_*waz 33

当你写int fun2(int fun()),参数int fun()转换成int (*fun)(),它变得完全等同于:

int fun2(int (*fun)());
Run Code Online (Sandbox Code Playgroud)

当您将其声明为函数参数时,在数组的情况下会发生更多的famiiar转换.例如,如果你这样:

int f(int a[100]);
Run Code Online (Sandbox Code Playgroud)

即使在这里参数类型转换成int*,它变为:

int f(int *a);
Run Code Online (Sandbox Code Playgroud)

函数类型和数组类型分别转换为函数指针类型和指针类型的原因是因为标准不允许将函数和数组传递给函数,也不能从函数返回函数和数组.在这两种情况下,它们都会衰减为指针版本.

C++ 03标准在§13.1/ 3中说(在C++ 11中也是如此),

仅在那一个中​​不同的参数声明是函数类型而另一个是指向相同函数类型的指针是等效的.也就是说,调整函数类型以成为函数类型的指针(8.3.5).

这里有一个更有趣的讨论:

  • 好答案.另外,我不知道这有效! (4认同)

asa*_*elr 6

int fun2(int (*fun)())并且int fun2(int fun())完全一样.当您从函数类型声明函数参数时,编译器会将其用作指向同一函数类型的指针.