5个回答
展开全部
函数指针告诉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;
}
展开全部
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;
}
楼主可以慢慢体会,不懂再问吧
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在定义函数指针的时候也很绕人。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
返回指针函数的原型:类型名*函数名(参数列表);
如果按照你的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说明你是没有返回值那不是很茅盾?;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
呵呵,看来你学得挺深啦!:)
-----------------------
假设函数定义如下
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);
-----------------------
假设函数定义如下
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的含义。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
typedef void (*pFunc)();
void func1()
{
printf("This is func1\n");
}
int main(void)
{
pFunc p = func1;
p();
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询