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

c++的函数指针是怎么用的呀?

发布网友 发布时间:2022-05-13 22:49

我来回答

5个回答

热心网友 时间:2023-11-04 01:13

函数指针,即指向函数的指针。

1.     定义

每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。

2.     语法

指向函数的指针变量的一般定义形式为:

数据类型 (*指针变量名)(参数表);

3.     说明

1) 函数指针的定义形式中的数据类型是指函数的返回值的类型。

2) 区分下面两个语句:

int (*p)(int a, int b); //p是一个指向函数的指针变量,所指函数的返回值类型为整型

int *p(int a, int b); //p是函数名,此函数的返回值类型为整型指针

3) 指向函数的指针变量不是固定指向哪一个函数的,而只是表示定义了一个这样类型的变量,它是专门用来存放函数的入口地址的;在程序中把哪一个函数的地址赋给它,它就指向哪一个函数。

4) 在给函数指针变量赋值时,只需给出函数名,而不必给出参数。

如函数max的原型为:int max(int x, int y); 指针p的定义为:int (*p)(int a, int b); 则p = max;的作用是将函数max的入口地址赋给指针变量p。这时,p就是指向函数max的指针变量,也就是p和max都指向函数的开头。

5) 在一个程序中,指针变量p可以先后指向不同的函数,但一个函数不能赋给一个不一致的函数指针(即不能让一个函数指针指向与其类型不一致的函数)。

如有如下的函数:int fn1(int x, int y); int fn2(int x);

定义如下的函数指针:int (*p1)(int a, int b); int (*p2)(int a);

p1 = fn1; //正确

p2 = fn2; //正确

p1 = fn2; //产生编译错误

6) 定义了一个函数指针并让它指向了一个函数后,对函数的调用可以通过函数名调用,也可以通过函数指针调用(即用指向函数的指针变量调用)。

如语句:c = (*p)(a, b); //表示调用由p指向的函数(max),实参为a,b,函数调用结束后得到的函数值赋给c。

7) 函数指针只能指向函数的入口处,而不可能指向函数中间的某一条指令。不能用*(p+1)来表示函数的下一条指令。

8) 函数指针变量常用的用途之一是把指针作为参数传递到其他函数

实例:

#include <iostream>  
using namespace std;  
#include <conio.h>  
  
int max(int x, int y); //求最大数  
int min(int x, int y); //求最小数  
int add(int x, int y); //求和  
void process(int i, int j, int (*p)(int a, int b)); //应用函数指针  
  
int main()  
{  
    int x, y;  
    cin>>x>>y;  
  
    cout<<"Max is: ";  
    process(x, y, max);  
  
    cout<<"Min is: ";  
    process(x, y, min);  
  
    cout<<"Add is: ";  
    process(x, y, add);  
  
    getch();  
    return 0;  
}  
  
int max(int x, int y)  
{  
    return x > y ? x : y;  
}  
  
int min(int x, int y)  
{  
    return x > y ? y : x;  
}  
  
int add(int x, int y)  
{  
    return x + y;  
}  
  
void process(int i, int j, int (*p)(int a, int b))  
{  
    cout<<p(i, j)<<endl;  
}

热心网友 时间:2023-11-04 01:14

以前写的一个例子。。可能比较乱。。

// Pratice19.cpp : Defines the entry point for the console application.
/* void (*f)();//函数指针
void* f(); //函数返回指针
const int* //const指针
int * const //指向const的指针
const int* const //指向const的const指针
*/

#include "stdafx.h"
#include <iostream.h>
#include <stdio.h>

int max(int x, int y)
{
return x>y?x:y;
}

void FileFunc()
{
printf("FileFunc()\n");
}

void EditFunc()
{
printf("EditFunc()\n");
}

char *ch(char *str1, char *str2)

{

int i;

char *p;

p=str2;

if(*str2==NULL)
{
printf("null") ;
};

do

{

*str2=*str1;

str1++;

str2++;

}while(*str1!=NULL);

return(p);

}

float *find(float(*pointer)[4], int n) //定义指针函数,形参pointer是指针指向包含4个元素的一维数组的指针变量,
{
float *pt;
pt = *(pointer+n); //pointer+1指向 score的第一行。*(pointer+1)指向第一行的第0个元素
return pt;

}

int add1(int a,int b)
{
return a+b;
}

int add2(int a,int b)
{
return a+b;
}

int main(int argc, char* argv[])
{
struct S
{
int i;
int *p;
};
S s;
int *p = &s.i;
p[0] = 1;
p[1] = 2;
s.p = p;
s.p[0] = 3;
s.p[1] = 4;
cout << p[0] << ' ' <<s.i<<endl;
cout << &p[0] << ' ' << &s.i << endl;
cout << p[1] << ' ' << s.p << ' ' << &s.p[0] << endl;
cout << &p[1] <<' ' <<&s.p<<' '<<&s.p[1] << endl;

/*函数指针问题,就像数组是指向数组的第一个元素的常指针一样,函数名也是指向函数的指针,可以声明一个指向函数的指针变量,并且用这个指针来指向其它函数
float (**def)[10]; //def是一个二级指针,他指向的是一个一维数组的指针,数组的元素都是float型
double*(*gh)[10]; // gh是一个指针,他指向一个一维数组,数组元素都是double*型的
double(*f[10])(); //f是一个数组,他有10个元素,元素是函数的指针,指向的函数类型是无参,返回值是double型的函数
int*((*b)[10]); //和int*(*b)[10]是一样的,b是一个一维数组的指针
long (*fun)(int); //函数指针,指向函数的指针,这个指针的返回值是long ,所带的参数时是int ,
long *fun(int); //指针函数,是个带有整型参数返回长整型变量的指针的函数
int (*(*F)(int ,int))(int) //F是一个指向函数的指针,他指向这样一个函数(该函数参数为(int ,int),返回值为一个指针)
//,返回的这个指针指向的是另外一个函数(参数类型是int,返回值为int型的函数)
*/

//函数指针是指向函数的指针变量。
/* 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、
数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。
有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,
在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的声明方法为:
数据类型标志符 (指针变量名) (形参列表);
注1:“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,
后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:
int func(int x); // 声明一个函数
int (*f) (int x); // 声明一个函数指针
f=func; //将func函数的首地址赋给指针f
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
注2:函数括号中的形参可有可无,视情况而定。
*/
/*max()的入口地址赋给p,以后就可以用p用该函数,实际上p和max都指向同一个入口地址,不同就是p是一个指针变量,不像函数名称
那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用
它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。
*/
int max(int,int);
int (*f)(int,int) = &max; //函数指针
int a, b, c, d;
printf("please input three integer:\n");
scanf("%d %d %d",&a, &b, &c);
d = (*f)((*f)(a, b),c);
printf("三个数种最大值是%d\n",d);
//
void (*funcp)();

funcp = FileFunc; //先指向FileFunc
(*funcp)();
funcp = EditFunc; //再指向另一个函数
(*funcp)();

//
printf("please intput a interger again:\n ");
int i,j,k;
scanf("%d",&i);
int (*fg)(int,int); /* 定义函数指针 */
fg = max; /* 给函数指针p赋值,使它指向函数max */
printf("再连续输入9个数\n");
for(k = 1;k<9;k++)

{
scanf("%d",&j);
i = (*fg)(i,j); /* 通过指针p调用函数f */

}
printf("The Max Number is:%d\n",i);

/*指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型
是某一类型的指针。
其定义格式如下所示:
返回类型标识符 *返回名称(形式参数表)
{ 函数体 }
返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,
它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是
函数本身而已,而整个函数相当于一个“变量”
*/

//
char *ch(char *,char *); //指针函数
char str1[]="I am glad to meet you!";
char str2[]="Welcom to study C!";
printf("%s", ch(str1, str2));

//
float *find(float(*pionter)[4], int n);
static float score[][4] = {{78,45,34,90},{78,89,78,98},{45,32,89,78},{65,89,56,98}};
float *pt;
int m;
cout << "enter the number you want to find:" << endl;
cin >> m;
pt = find (score, m);
for (i = 0; i < 4; i++)
{
cout << *(pt+i) <<' '<<endl;
}

/*关于函数指针数组的定义方法,有两种:一种是标准的方法;一种是蒙骗法。
第一种,标准方法:

分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。
根据分析:首先说明是一个数组:数组名[]
其次,要说明其元素的数据类型指针:*数组名[].
再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型 (*数组名[])().请注意,这里为什么要把“*数组名[]”用括
号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向
,那么 *数组名[]() 说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数祖吗?不知道。所以必须括起来,以保证数组
的每一个元素是指针。
第二种,蒙骗法:
尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数方法是:用不带有括号和参数的函数名得到。
函数名相当于一个指向其函数入口指针常量。 那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。
那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。
*/
int num1 = 1;
int num2 = 2;
int num3 = 3;
int num4 = 4;
int (*ftr[2])(int a,int b);
ftr[0] = add1;
ftr[1] = add2;
printf("%d %d\n",ftr[0](num2,num1),ftr[1](num2,num4));

return 0;
}

热心网友 时间:2023-11-04 01:14

如:
有一函数
void fun(void);//这是fun函数的声明
fun(){};//这是fun函数的调用
fun;//当只是函数的名字的时候就代表着函数入口的地址

这样,我们可以通过定义一个指针,然后使这个指针指向函数的入口,这样,我么就可以间接调用函数了。

具体例子
int main()
{void (*p)(int n);//声明函数指针的时候,参数的个数和类型必须和被指向的函数相同
void fun(int a);
p=fun;//指针p指向fun,fun是地址,正确
(*p)(0);//通过指针调用函数,与p();等价其中0是作为函数的参数
return 0;}

void fun(int a)
{}

因为函数的调用是需要一定的开销的,当一个函数经常被调用的时候,如果函数只有几行,这样我们可以通过inline函数来解决函数调用开销的问题。
但是如果函数有很多行且经常调用,那么,我们可以通过函数指针来解决函数调用开销的问题

热心网友 时间:2023-11-04 01:15

函数指针就是指向函数入口的指针,就像数组名代表数组首地址一样,你详细的看看谭浩强的c语言。c++中函数指针貌似在MFC的RTTI中有用到。其他的没什么啊,c++最重要的是继承、多态,和泛型设计啊。

热心网友 时间:2023-11-04 01:16

简单点说,就是你可不是事先指定调用哪个函数,留个指针在那,你以后想调用哪个函数,只需给那人个指针赋值就可以了

参考资料:c

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在爱水APP哪个模块中可以填写个人信息,查询自己一天的饮水量? 黄金为什么是避险产品 避险买什么 避险品种是什么 避险产品什么意思 什么是避险产品 ...对联和我们平时使用的印章,说说使用了哪几个字体 对联上写的是什么字 ...有一空是让我评价我自己,请各位哥哥姐姐帮帮忙,帮我编一段,往好了... 艾灸用品哪种好 360贷四万块,一年交利息是多少? 网页打开的速度慢原因? 怎么用jquery实现菜单的联动 函数指针的几种用法 你们觉得刚开始喝普洱茶,是喝生普好还是熟普好呢? 华为p20 pro可以用beats studio3吗 两条腿疼,好像肌肉酸痛。站一会就感觉累怎么回事啊 美甲顺序是什么呢? 今日头条,标题用场标题好,还是短标题好。 头条号标题怎么写? 含有草字的常见诗句? 《某某》是真的绝版了吗? 洛天依的《某某》的歌词 太保人寿是什么内容 太保人寿是太平人寿么 太保人寿是什么?热 老凤祥的三八妇女节员工从几号能接到活动通知 win7下怎么恢复开机时的一键还原多系统选择菜单 吉他基础 吉他和弦分类,如大三和弦,还要根音,三音,五音,还有个别的七音关系 函数指针(指向函数的指针) 如何使用? 它和回调函数有什么区别呢? 指向函数的指针的用法? 指向函数的指针怎么使用 C 语言中指针函数是如何调用的?? 如何调用指针函数 带指针的函数怎么调用? 工控机里auo代表什么 c语言函数指针怎么用啊?尤其是main函数 c++课程设计 电影院自动售票机 友达AUOA48F和奇美CMN14D5屏幕哪个好 auo12303故障 auo能拼出多少个音节? AUO全称? Auo在运放电路中是什么意思 直接压榨出来的花生油可以直接使用吗?还是需要添加一些什么东西? 为什么叫金闪闪auo? 玉米油怎么用?和花生油还是豆油一样? 友达AUO13ed是什么样的屏幕,13ed代表什么? ag80环氧树脂在室温下多久凝固 氟塑料是否属于热固性树脂