问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请教C++中函数型指针和指针型函数的用法和区别,谢谢

发布网友 发布时间:2022-04-13 02:45

我来回答

6个回答

热心网友 时间:2022-04-13 04:14

1 函数指针变量
在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);
4) 调用函数的一般形式为:
(*指针变量名) (实参表)
使用函数指针变量还应注意以下两点:
a) 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。
b) 函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。

2 指针型函数
前面我们介绍过,所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。
定义指针型函数的一般形式为:
类型说明符 *函数名(形参表)
{
…… /*函数体*/
}
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
如:
int *ap(int x,int y)
{
...... /*函数体*/
}
表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
【例】本程序是通过指针函数,输入一个1~7之间的整数,输出对应的星期名。
main(){
int i;
char *day_name(int n);
printf("input Day No:\n");
scanf("%d",&i);
if(i<0) exit(1);
printf("Day No:%2d-->%s\n",i,day_name(i));
}
char *day_name(int n){
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return((n<1||n>7) ? name[0] : name[n]);
}

本例中定义了一个指针型函数day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组name。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。在主函数中,把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n。day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。主函数中的第7行是个条件语句,其语义是,如输入为负数(i<0)则中止程序运行退出程序。exit是一个库函数,exit(1)表示发生错误后退出程序,exit(0)表示正常退出。
应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int(*p)()和int *p()是两个完全不同的量。
int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。
int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。
对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。

热心网友 时间:2022-04-13 05:32

函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。
函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数。
函数指针的声明方法:
数据类型标志符 (指针变量名) (形参列表);
一般函数的声明为:
int func ( int x );
而一个函数指针的声明方法为:
int (*func) (int x);
前面的那个(*func)中括号是必要的,这会告诉编译器我们声明的是函数指针而不是声明一个具有返回型为指针的函数,后面的形参要视这个函数指针所指向的函数形参而定。
然而这样声明我们有时觉得非常繁琐,于是typedef可以派上用场了,我们也可以这样声明:
typedef int (*PF) (int x);
PF pf;
这样pf便是一个函数指针,方便了许多。当要使用函数指针来调用函数时,func(x)或者 (*fucn)(x) 就可以了,当然,函数指针也可以指向被重载的函数,编译器会为我们区分这些重载的函数从而使函数指针指向正确的函数。
例子:
复制代码
typedef void (*PFT) ( char ,int );
void bar(char ch, int i)
{
cout<<"bar "<<ch<<' '<<i<<endl;
return ;
}
PFT pft;
pft = bar;
pft('e',91);
复制代码

typedef void (*PFT) ( char ,int );
void bar(char ch, int i)
{
cout<<"bar "<<ch<<' '<<i<<endl;
return ;
}
void foo(char ch, int i, PFT pf)
{
pf(ch,i);
return ;
}
PFT pft;
pft = bar;
foo('e',12,pft);
复制代码

上述例子我们首先利用一个函数指针pft指向bar(),然后在foo()函数中使用pft指针来调用bar(),实现目的。将这个特点稍加利用,我们就可以构造出强大的程序,只需要同样的foo函数便可以实现对不同bar函数的调用。

热心网友 时间:2022-04-13 07:07

C#中采用委托的方式,其实和C++的typedef非常相像,都是必须先定义一个类型,然后用该类型去声明一个变量。最大的不同在赋值阶段,C++只需要简单的将函数地址赋给指针,而C#必须用new声明一个对象,并且还要求相应的函数作为形参传入。在这个阶段,似乎C#显得更为复杂。到了调用阶段,C++和C#都可以容器后加个括号就能完成调用,但C++还多了一种*的方式。

热心网友 时间:2022-04-13 08:58

简单的就是一个用指针去储存函数是函数型指针
而函数&形参为指针的是指针型函数

像函数型指针 :int (*s){int}; //用它去指向一个返回为INT函数 ,像int u(int s){}
然后把函数地址给*s,*s=u;
最后可以用s(5)就可以等于u(5);

而指针型函数,像void *s(char *s){}
就是了 。。。

热心网友 时间:2022-04-13 11:06

函数型指针是指针,指向函数
int (*fp)();
指针型函数是函数,返回指针
int * pf();

热心网友 时间:2022-04-13 13:31

函数型指针,也即指针指向的是一种函数类型,首先指向的是函数,并且这个函数有类型(形参,返回值)
如:
int (* pMax)(int a,int b);
指针 pMax 即是一个函数型指针,这个函数的类型是,返回值为int,并带有两个int 型的形参

指针型函数,也即返回类型为指针的函数
如:
char * mystrcat(char * p1,const char *2);
char *s1 = "jaycnvip";
char *purl = mystrcat(s1,".com");
指针 purl 即保存了函数 mystrcat 返回的字符指针
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 什么国家蚂蚁最多(快快快) 这是什么蚂蚁?咬人又疼又痒,还有水泡,三四天没好 赣州国蚁是传销吗?可以做吗? 一国争诸国蚁附 一国至诸蜂从 翻译一下 江西国蚁电子商务有限公司 怎样可以预防乳腺癌? 你知道乳腺癌偏爱哪些人群吗?日常生活中该怎么预防呢? 乳腺癌已经成为全球最常见的癌症,我们该如何预防这种疾病? 乳腺癌的前兆,怎么预防? 乳腺癌的症状有哪些,还有如何预防? 我有一笔单,昨天不小心付,我要退款,怎么退款? 电视剧康熙王朝谁送给皇帝一幅大清的全地图啊? 谁绘制了《皇舆全览图》? 周培公真给康熙画地图了吗 谁给康熙献中国地图 周培公绘制地图历史是否真实 我们国家清朝的第一副地图是谁画的? 康熙王朝上制作那个大地图的那个人叫什么 《康熙王朝》中,周培公送给康熙大清地图,这图怎么来的? 康熙王朝里面的那个地图真的有吗? 小小蚁国蚁后满级多少 女生短发怎么编头发才好看 谁知道这是什么昆虫?像放大版的谷牛,妈妈养的,她说是泰国蚂蚁,吃了可以治胃病。 波波头发型 树袋熊是哪个国家蚂蚁庄园 中国白蚁防治第一村 树袋熊是哪个国家蚂蚁庄园? 腾讯的防沉迷系统 中国蚂蚁和蛇子什么多? 中国蚁子最多的地方能种水稻吗? 分享经济属于互联网+的什么特征 树化石对人有什么好处 linux运维工程师前景怎样?去培训,有好的建议吗? 中国真的有玉化树吗 分享经济是什么?和互联网+的区别! 木化石的灵性作用 互联网+分享经济, 分享经济属于互联网 的什么特征 木化石是否适宜在家中摆放? 谁有2020寒假初二魏桂双语文阅读写作直播班直播课的免费百度云资源链接可以分享一下吗