C语言如何声明一个返回函数指针的函数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言如何声明一个返回函数指针的函数?相关的知识,希望对你有一定的参考价值。

我这样声明为什么不行:int (*)() function();
相同的还有返回数组指针的函数怎样声明?
我要声明的是一个函数,它返回一个指针,这个指针是一个指向另一个函数的指什!!

C语言指向函数的指针承载的信息比较复杂,组织起来要素要写全。根据指向函数的指针的书写语法,下面的代码就是一个返回函数指针的函数:

int (*f(void))(int)//f是函数,没有参数,返回指向一个函数的指针;这个被指向的函数有一个int型形参,且返回一个int值

    return fun;//fun是个函数名,必须具备一个int形参、返回int值的要求

以下代码可以验证上述函数的正确性:

//#include "stdafx.h"//If the vc++6.0, with this line.
#include "stdio.h"
int fun(int n)
    printf("abcdef\\n");
    return n;

int (*f(void))(int)
    return fun;

int main(void)
    printf("%d\\n",f()(100));//调用函数f,通过f返回的指针用100调用函数fun
    return 0;

输出是:

abcdef

100

参考技术A int (*pf)();pf=f; /*f为函数名*/
函数指针变量

在C语言中规定,一个函数总是占用一段连续的内存区, 而函数名就是该函数所占内存区的首地址。 我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量, 使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。 我们把这种指向函数的指针变量称为“函数指针变量”。
函数指针变量定义的一般形式为:
类型说明符 (*指针变量名)();
其中“类型说明符”表示被指函数的返回值的类型。“(* 指针变量名)”表示“*”后面的变量是定义的指针变量。 最后的空括号表示指针变量所指的是一个函数。
例如: int (*pf)();
表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。
下面通过例子来说明用指针形式实现对函数调用的方法。
int max(int a,int b)
if(a>b)return a;
else return b;

main()
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:\n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);

从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:1. 先定义函数指针变量,如后一程序中第9行 int (*pmax)();定义pmax为函数指针变量。

2. 把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第11行 pmax=max;

3. 用函数指针变量形式调用函数,如程序第14行 z=(*pmax)(x,y); 调用函数的一般形式为: (*指针变量名) (实参表)使用函数指针变量还应注意以下两点:

a. 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。

b. 函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。
参考技术B 返回值类型名 *函数名( 形参列标 ) //函数名前的*号不能丢


.....函数体
参考技术C typedef int (*AA)();
AA function();本回答被提问者和网友采纳
参考技术D int (*(* func)())();
int* (*func1)();

指针的高阶用法——从函数返回指针

在上一章中,我们已经了解了 C 语言中如何从函数返回数组,类似地,C 允许您从函数返回指针。为了做到这点,您必须声明一个返回指针的函数,如下所示:

int * myFunction()
{
.
.
.
}

另外,C 语言不支持在调用函数时返回局部变量的地址,除非定义局部变量为 static 变量。

现在,让我们来看下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第一个数组元素的地址)来返回它们,具体如下:

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

/* 要生成和返回随机数的函数 */
int * getRandom( )
{
   static int  r[10];
   int i;
 
   /* 设置种子 */
   srand( (unsigned)time( NULL ) );
   for ( i = 0; i < 10; ++i)
   {
      r[i] = rand();
      printf("%d
", r[i] );
   }
 
   return r;
}
 
/* 要调用上面定义函数的主函数 */
int main ()
{
   /* 一个指向整数的指针 */
   int *p;
   int i;
 
   p = getRandom();
   for ( i = 0; i < 10; i++ )
   {
       printf("*(p + [%d]) : %d
", i, *(p + i) );
   }
 
   return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

1523198053
1187214107
1108300978
430494959
1421301276
930971084
123250484
106932140
1604461820
149169022
*(p + [0]) : 1523198053
*(p + [1]) : 1187214107
*(p + [2]) : 1108300978
*(p + [3]) : 430494959
*(p + [4]) : 1421301276
*(p + [5]) : 930971084
*(p + [6]) : 123250484
*(p + [7]) : 106932140
*(p + [8]) : 1604461820
*(p + [9]) : 149169022

以上是关于C语言如何声明一个返回函数指针的函数?的主要内容,如果未能解决你的问题,请参考以下文章

C 从函数返回指针

C 从函数返回指针

指针的高阶用法——从函数返回指针

c语言中如何一个函数的多次调用

C语言基础:函数指针与回调函数size_t类型

C语言函数如何return数组?