c语言的函数指针举个例子

vod*func(void){}... vod * func(void) {} 展开
 我来答
文正153
推荐于2018-03-13 · TA获得超过2.1万个赞
知道大有可为答主
回答量:2221
采纳率:63%
帮助的人:632万
展开全部

函数指针告诉CPU下一步需要执行哪里的代码的指针, 一数组十分相像.

#include <stdio.h>
void function(int i, double d)    //一个函数的声明
{
    printf("函数运行, %d, %lf\n", i, d);
}
void AnotherFunction(int i, double d)    //另外一个函数声明
{
    printf("又一个函数运行, %d, %lf\n", i, d);
}
int main()
{
    void (*pFun)(int, double);    //定义了一个函数指针
    int (*p)(int , double);    //用于调试的函数指针
    pFun = function;    //让这个函数指针指向第一个函数
    pFun(10, 10.101);    //通过这个函数指针来调用第一个函数
    
    pFun = AnotherFunction;    //让这个函数指针指向第二个函数
    pFun(20, 20.202);    //通过这个函数指针来调用第二个函数
    
    //若将以下代码取消注释, 就会产生错误
    /*
    p = function;
    p = AnotherFunction;
    //原因很简单, 因为p是必须指向一个返回值为int, 第一个参数为int, 第二个参数为double的函数, 但是在此代码中定义的函数返回值是void
    */
    
    //这个实验中, 直接用函数名来赋值了, 是因为函数名其实就是这个函数的指针
    //而在平常调用函数时, 都要加上(), 如:printf("");
    //这里, "()"就相当于'*'(就是取值运算符), printf是函数指针, 就相当于是数组名, 即数组的首地址
    
    return 0;
}
firememory
推荐于2017-11-26 · TA获得超过137个赞
知道小有建树答主
回答量:93
采纳率:0%
帮助的人:104万
展开全部
mxl033 回答是对的。
void* func(void)这种不是函数指针,而只是一个返回一个指针的函数。是函数,而不是指针。

typedef void (*pFunc)(); // 函数指针类型声明,指向的是无返回无参数的函数.
typedef int (*pFunc1)(int,int); // 函数指针类型声明,指向的是返回int型,参数有两个int型的函数。

void func1()
{
printf("This is func1\n");
}

int add(int a, int b)
{
return a + b;

}
int main(void)
{
pFunc p = func1; // 函数指针复制
p();

// p = add; 错误,返回类型,和参数都不符合

pFunc1 p1 = add;

p1(1,2) // 返回3

return 0;
}

楼主可以慢慢体会,不懂再问吧
追问
前面说得挺好,不过typedef void (*pFunc)();   //这句我就看不懂了,是把 void 重定义为 (*pFunc)()吗?还是你省略了某些内容
追答
不是的,这就是定义一个函数函数指针类型, 是吧一个无返回数据没有的参数的函数类型定义为 pFunc,而不是把 void重定义为 (*pFunc)()。 其实是把 一个  void (*)() 这么一个类型定义为 pFunc.其实我也觉得typedef在定义函数指针的时候也很绕人。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
仙戈雅3n
2013-09-17 · TA获得超过5790个赞
知道大有可为答主
回答量:2398
采纳率:75%
帮助的人:897万
展开全部

返回指针函数的原型:类型名*函数名(参数列表);

如果按照你的vod * func(void) {}感觉不太对。既然有返回值(指针),怎么会是void呢。所以显示不对。

下面写了一个返回指针值的函数的例子。你可参考下:

#include <stdio.h>
char *func(void)
{
static char a[20]="Hello,C language.";
return a;
}
void main(void)
{
char *p;
p=func();
while(*p)
printf("%c",*p++);
printf("\n");
}
追问
void * func应该可以表示指针的哦
追答
不可以,感觉茅盾,因为返回指针函数,就肯定有一个返回值(具体看你定义的是什么基类型,如int,char,double)如果你在返回值类型加了void说明你是没有返回值那不是很茅盾?;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
freeeeeewind
2013-09-17 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1350万
展开全部
呵呵,看来你学得挺深啦!:)
-----------------------
假设函数定义如下
int func( int a, int b)
{
return a+b;
}
-------------------------
1)声明一个指针变量 pFunc,该变量指向函数func
int (*pFunc) (int, int);
2)给pFunc赋值: pFunc = func (或者 pFunc = &func)
3)使用pFunc:
int result;
result = pFunc(1, 2);
更多追问追答
追问
像 mxl033 回答那样重新定义一个变量 pFunc p ,再对p=func效果也是一样的吧?
追答
一样的!mxl033的编程风格更专业。
另外:
void * func(void);
void (*func)(void);
两者的定义是不一样的。
第一个 void * func() 定义确切含义是: 定义了一个名为func的函数,这个函数的参数为空(void),且函数返回值类型 为 void *,也就是传说中的“万能指针”;
第二个 void (*func)(void)定义的含义是:定义一个指针func,该指针指向一个参数为空,且含返回值为空的函数;
差别在于:第二个定义中出现在 (*func) 两侧的括号。正是由于这对括号改变了标识符func的含义。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mxl033
2013-09-17 · TA获得超过216个赞
知道小有建树答主
回答量:120
采纳率:61%
帮助的人:84.2万
展开全部
typedef void (*pFunc)();
 
void func1()
{
    printf("This is func1\n");
}
 
int main(void)
{
    pFunc p = func1;
    p();  

    return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式