函数指针和指针函数
- 格式:doc
- 大小:17.00 KB
- 文档页数:7
周立功手把手教你学嵌入式编程:函数指针与指针函数的应用周立功教授数年之心血之作《 2.1 函数指针与指针函数>>> 2.1.1 函数指针 int (*pf)(int); // pf函数指针的类型是什么?typedef int (*pf)(int a);typedef int (*PF)(int a); PF pf1, pf2; int (*pf1)(int a); 1 #includevoid * pf = add; >>> 2.1.2 指针函数 1 #includeint *pf(int *, int); // int *(int *, int)类型int (* ff (int))(int, int); // ff是一个函数typedef int (*PF)(int, int); PF ff(int);1 #include2 #include3 double getMin(double *dbData, int iSize) // 求最小值4 {5 double dbMin;67 assert((dbData != NULL)8 dbMin = dbData[0];9 for (int i = 1; i dbData[i]){11 dbMin = dbData[i];12 }13 }14 return dbMin;15 }1617 double getMax(double *dbData, int iSize) // 求最大值18 {19 double dbMax;2021 assert((dbData != NULL)22 dbMax = dbData[0];23 for (int i = 1; i前4个函数分别实现了求最大值、最小值、平均值和未知算法,getOperation()根据输入字符得到的返回值是以函数指针的形式返回的,从pf(dbData, iSize)可以看出是通过这个指针。
函数指针定义
函数指针,也叫作函数指示器,是一种特殊的指针,它存储着函数的入口地址,可以指向任何没有参数的函数(普通函数),或者指向带有相同参数(多参数)的函数。
函数指针可以使程序员引用和调用函数,这样可以更加轻松地完成函数的定义,它们给出了一种分离函数、数据和作用域的方式,同时又能够让程序的可移植性得到保障。
函数指针通常表示为一个指针变量,可以指向任意函数,这个变量必须要有一个可用于调用函数的形参。
程序员定义一个函数指针,需要按特定的语法来定义,它可以在函数声明前定义或者定义成一个指向函数的指针函数。
函数指针在编程中被广泛地应用,最常用的方式是定义函数指针,然后把这个指针传递给另一个函数,以便在另一个函数中可以调用它,也可以用函数指针实现回调函数,以便在同一个程序中实现事件处理函数的调用。
函数指针在C语言中是一种重要的概念,它可以用于改变程序的控制流,可以用来实现代码的重用以及代码的模块化,比如用指针变量调用某个函数,可以让程序的执行流向转移到函数的位置。
还可以用指针变量来实现抽象,可以实现函数指针数组指向不同的函数,以便在运行时动态调用不同的函数。
此外,函数指针还可以用于实现函数重载,可以用来实现任意数量任意类型的参数调用函数,以及实现可变参数列表调用函数,函数指针还可以用来实现类似于访问者模式的数据访问,它把数据和行为分离,这样可以使数据的操作更加灵活和统一。
总的来说,函数指针的使用可以让程序的结构更加清晰,即使在非常复杂的程序环境中也可以使用函数指针来控制程序的行为和数据的存储,使程序的运行更加高效,并且保证程序的可移植性。
因此,函数指针在编程中是一种非常重要的概念,在实现代码的重用和模块化以及实现高效运行时都可以发挥重要作用。
什么是函数指针(理解及使用)
函数指针是指指向函数的指针变量。
函数指针可以像一般指针那样引
用函数。
它可以把函数的调用和实现分开,从而使我们可以在不改变函数
定义的情况下改变函数的调用方式。
函数指针的定义
returntype(*ptr)(argument list);
其中,ReturnType是函数返回类型,也是指针变量的数据类型,ptr 是指针变量的变量名,argument list 是函数参数列表。
函数指针的使用
函数指针可以像一般指针那样,使用指针运算符来引用函数。
以下是
一个函数指针的初始化:
int (*pf)(int, int);
这里,pf 是一个函数指针,它指向一个含有两个 int 型参数的函数,它的返回类型是 int。
在调用函数时,可以使用函数指针:
int x, y;
int sum;
sum = pf(x,y);
也可以使用函数名调用函数:
sum = func(x,y);
上述两种方式在执行上是没有区别的,它们可以互换使用。
通过函数指针可以分离函数的调用与实现,这让我们可以在不改变函数名的情况下,改变程序的调用方式。
例如,可以使用函数指针实现函数重载,也可以使用函数指针来实现在运行时动态选择函数,如下所示:int (*pf)(int, int);
void selectfunc
int a;
//获取一些参数
if (a == 0)。
一、指针函数当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。
格式:类型说明符 * 函数名(参数)当然了,由于返回的是一个地址,所以类型说明符一般都是int。
例如:int *GetDate();int * aaa(int,int);函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。
int * GetDate(int wk,int dy);main(){int wk,dy;do{printf(\"Enter week(1-5)day(1-7)\\n\");scanf(\"%d%d\",&wk,&dy);}while(wk<1||wk>5||dy<1||dy>7);printf(\"%d\\n\",*GetDate(wk,dy));}int * GetDate(int wk,int dy){static int calendar[5][7]={{1,2,3,4,5,6,7},{8,9,10,11,12,13,14},{15,16,17,18,19,20,21},{22,23,24,25,26,27,28},{29,30,31,-1}};return &calendar[wk-1][dy-1];}程序应该是很好理解的,子函数返回的是数组某元素的地址。
输出的是这个地址里的值。
二、函数指针指向函数的指针包含了函数的地址,可以通过它来调用函数。
声明格式如下:类型说明符 (*函数名)(参数)其实这里不能称为函数名,应该叫做指针的变量名。
这个特殊的指针指向一个返回整型值的函数。
指针的声明笔削和它指向函数的声明保持一致。
指针名和指针运算符外面的括号改变了默认的运算符优先级。
如果没有圆括号,就变成了一个返回整型指针的函数的原型声明。
例如:void (*fptr)();把函数的地址赋值给函数指针,可以采用下面两种形式:fptr=&Function;fptr=Function;取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
函数指针和指针函数用法和区别函数指针和指针函数(pointerfunction)是C语言编程中常用的技术,在一些高级编程技术(例如设计模式)中也有广泛的应用。
它们的概念比较复杂,有时候会让初学者有点晕头,但是一旦理解了它们的用法和区别,大家就会发现它们对于结构化编程的设计有着重要的意义。
本文尝试以最简单的方式阐述函数指针和指针函数的用法和区别。
首先,在我们讨论函数指针和指针函数之前,我们最好以一个函数为例来介绍它们:void foo (int a, int b){int c = a + b;printf(%dc);}foo函数接收两个整数参数a和b,并将它们相加后输出结果。
接下来我们来看看函数指针是什么:函数指针(function pointer)是一种指向函数的指针,它可以把函数的地址保存在指针变量中,这样你就可以通过指针调用函数。
句话说,它实际上指向一个函数,通过调用它,你可以调用函数。
函数指针的声明可以形式如下:void (*fooPtr)(int, int);其中,fooPtr是函数指针变量,函数指针变量fooPtr可以指向函数foo()。
函数指针可以赋值,例如:fooPtr=foo;此外,你可以使用函数指针调用函数,例如:(*fooPtr)(1,2);这里,可以说fooPtr指向函数foo(),并且调用函数foo()。
现在,让我们来看看指针函数是什么:指针函数(pointer function)是一种特殊的函数,其返回值类型是指针,即它是一种不接受参数并返回指针的函数。
指针函数的声明可以形式如下:int *fooPtr(void);其中,fooPtr()是指针函数,它返回一个int类型的指针。
指针函数可以调用,例如:int *p = fooPtr();这里,fooPtr()调用了指针函数,并将返回的指针赋值给*p。
了解了函数指针和指针函数的基本概念及其用法后,那么函数指针和指针函数有什么区别?函数指针和指针函数的主要区别在于,函数指针可以指向任何函数,而指针函数必须返回指针类型的变量,并且不接受任何参数。
c语言函数指针
c语言函数指针是一种非常常用的概念,它可以在编程中发挥效用。
它可以为程序设计师提供灵活性,以便他可以更好地完成他的任务。
这篇文章将介绍什么是函数指针,函数指针的基本原理,函数指针的应用以及如何在c语言中实现函数指针。
什么是函数指针?函数指针是一个指针,指向一个函数。
它是一种指针类型,可以指向任何函数,无论该函数的返回类型或参数类型如何。
函数指针可以被认为是一个特殊的变量,它是指向函数的指针,而不是指向其他类型的普通指针。
函数指针的基本原理是,函数指针可以指向一个函数,以便您可以在不宣布函数的情况下使用它。
换句话说,它将指向一个函数的地址,以便您可以调用它。
例如,您可以使用函数指针来指向一个预先声明的函数,即使您不知道它的签名如何。
通过这种方式,函数指针可以用于抽象函数的调用,以及简化编程任务。
函数指针的应用很广泛,它可以用于实现多态、回调函数和事件处理程序等技术。
它也可以用于处理复杂的函数,如自定义排序算法,以及实现动态链接库。
在c语言中实现函数指针非常容易,只需定义函数指针即可。
首先,定义一个函数指针变量,并且为它分配存储空间。
接下来,使用指针语法来定义函数指针。
最后,使用指针变量来引用函数,即以指针的形式调用函数。
总而言之,函数指针是一种及其强大的概念,它可以在c语言编
程中发挥重要作用。
它可以被用于实现多态、回调函数和事件处理程序等功能,这些功能给程序设计师提供了函数抽象和灵活性,以便更加轻松地完成编程任务。
函数指针的定义函数指针,又称为函数引用,是指向函数的指针,它可以用来引用函数,从而使用函数指针来调用函数。
它们可以指向任何返回类型的函数,包括内联函数和扩展函数。
由于函数指针可以指向任何返回类型的函数,因此可以将它们用作动态链接,即当函数指针指向给定的函数时,调用函数指针就会调用该函数。
函数指针的一个主要用途是函数的封装,可以将函数指针作为函数参数传递。
C语言中的函数指针声明是一个比较复杂的知识点,它的声明格式如下:void (*ptr) (data type);其中,ptr函数指针的名称,data type函数指针所指向的函数的参数类型。
另外,函数指针也可以声明多个参数,它的声明格式如下:void(*ptr) (data type1, data type2, ...);其中,ptr函数指针的名称,data type1,data type2,...代表函数指针指向的函数参数类型。
当有了函数指针的声明后,接下来就可以初始化函数指针,初始化函数指针的常用格式如下:ptr = &functionName;该语句意思是将函数名称 functionName地址赋值给指针 ptr。
这样就可以通过指针 ptr用函数 functionName 了。
除了使用函数指针来调用函数外,C/C++言还有一种叫做函数指针数组的东西,它是一种特殊的数组,它存储的元素是函数指针,常见的声明格式如下:void (*arrPtr[n])(data type1, data type2, ...);其中,arrPtr函数指针数组的名称,n函数指针数组的元素的个数,data type1,data type2,... 代表函数指针指向的函数的参数类型。
函数指针数组的一个优点是它可以把多个函数名称存储到一个数组中,从而一次调用数组中的所有函数指针,从而实现代码的复用。
函数指针的另一个强大特性就是它可以实现回调函数,回调函数是指由调用程序自定义的一个函数,在某些情况下,调用程序可以使用函数指针传递给另一个函数,当函数处理完成后,被调用函数会调用另一个函数,也就是传递给它的函数指针指向的函数,这样就实现了回调函数的功能。
函数指针和指针函数的区别函数指针和指针函数的区别函数指针和指针函数的区别,这两个概念其实是相同的,因为它们都使用了指针这一操作符。
但是指针并不是操作符,而是一种运算符,在某些时候我们可以把它理解成是一个名字,只要有它就能实现我们想要做的事情,指针可以进行变量间的相互赋值、取地址、相互之间的数学计算等操作,这就跟一般的运算符没什么太大的差异了。
下面简单介绍一下这两者的区别。
首先是定义方式上的不同:指针和函数是不同的,函数只要定义出来就会被赋予一个名称,当然也就拥有名字;而指针则需要定义指针变量,然后在程序中通过调用来改变其值,指针变量还具有动态性质,也就是说我们在进行运算或者赋值的时候会根据情况的不同而随着产生不同的结果。
如下图所示:函数和指针的定义都不难,不管是谁,基本上都可以明白它的意思。
另外指针是没有类型的,但是有指针的类型,例如 void* p,它是一个指针,它在类型上和一般的指针完全一样。
函数是有类型的,它和一般的变量很像,也分成静态和动态,静态的指针叫做原指针,动态的指针叫做伪指针。
在调用时,是必须使用原指针来传递参数的,即使是动态指针也是一样的道理。
函数与指针在概念上的区别还体现在指向一个对象的指针,指针函数是不能这样写的,因为如果你这样写的话,那么在运行时将会抛出巨大的错误。
另外在变量名字上,函数和指针是有区别的。
函数和指针虽然看起来非常相似,但是却有天壤之别。
一句话,函数就是运算符,指针是操作符。
如果你已经知道函数是怎么使用的,那么也许指针就好理解多了。
但是请记住,函数不代表就是代码。
函数不仅仅包括“带参”函数,还包括不带参数的函数。
也许你刚开始觉得指针就是一个符号而已,不用多少技巧就可以记住,可真正到了实际应用的时候就发现指针并不是一件容易的事情。
其实这个问题还比较好解决,学习函数的时候最重要的就是先弄清楚这些函数都有哪些特点,如何调用,然后再去慢慢熟悉这些函数的具体使用方法。
常量指针与指针常量一) 常量指针。
常量是形容词,指针是名词,以指针为中心的一个偏正结构短语。
这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针(变量)。
指针指向的对象是常量,那么这个对象不能被更改。
在C/C++中,常量指针是这样声明的:1)constint *p;2)intconst *p;常量指针的使用要注意,指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改,也就是说常量指针可以被赋值为变量的地址,之所以叫做常量指针,是限制了通过这个指针修改变量的值。
例如:int a = 5;constint b = 8;constint *c = &a; // 这是合法的,非法的是对c的使用*c = 6; // 非法,但可以这样修改c指向的对象的值:a = 6;constint *d = &b; // b是常量,d可以指向b,d被赋值为b的地址是合法的细心的朋友在使用字符串处理函数的时候,应该会注意到这些函数的声明。
它们的参数一般声明为常量指针。
例如,字符串比较函数的声明是这样的:intstrcmp(const char *str1, const char *str2);可是这个函数却可以接收非常量字符串。
例如这段程序:char *str1, *str2;str1 = "abcde1234";str2 = "bcde";if(strcmp(str1, str2) == 0){printf("str1 equals str2.");}str1和str2的内容显然是可以更改的,例如可以使用“str1[0] = x;”这样的语句把str1的内容由“abcde1234”变为“xbcde1234”。
因为函数的参数声明用了常量指针的形式,就保证了在函数内部,那个常量不被更改。
也就是说,对str1和str2的内容更改的操作在函数内部是不被允许的。
在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。
可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。
1.函数指针定义
函数类型(*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int (*f)(int x);
double (*ptr)(double x);
在定义函数指针时请注意:
函数指针和它指向的函数的参数个数和类型都应该是—致的;
函数指针的类型和函数的返回值类型也必须是一致的。
2.函数指针的赋值
函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。
例如,
int func(int x); /* 声明一个函数*/
int (*f) (int x); /* 声明一个函数指针*/
f=func; /* 将func函数的首地址赋给指针f */
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,
因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
3.通过函数指针调用函数
函数指针是通过函数名及有关参数进行调用的。
与其他指针变量相类似,如果指针变量pi是指向某整型变量i的指针,则*p等于它所指的变量i;如果pf是指向某浮点型变量f的指针,则*pf 就等价于它所指的变量f。
同样地,*f是指向函数func(x)的指针,则*f 就代表它所指向的函数func。
所以在执行了f=func;之后,(*f)和func代表同一函数。
由于函数指针指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。
现在我们就讨论如何用函数指针调用函数,它应执行下面三步:
首先,要说明函数指针变量。
例如:int (*f)(int x);
其次,要对函数指针变量赋值。
例如:f=func; (func(x)必须先要有定义)
最后,要用(*指针变量)(参数表);调用函数。
例如:(*f)(x);(x必须先赋值)
【例】任意输入n个数,找出其中最大数,并且输出最大数值。
main()
{
int f();
int i,a,b;
int (*p)(); /* 定义函数指针*/
scanf('%d',&a);
p=f; /* 给函数指针p赋值,使它指向函数f */
for(i=1;i<9;i++)
{
scanf('%d',&b);
a=(*p)(a,b); /* 通过指针p调用函数f */
}
printf('The Max Number is:%d',a)
}
f(int x,int y)
{
int z;
z=(x>y)?x:y;
return(z);
}
运行结果为:
343 -45 4389 4235 1 -534 988 555 789↙
The Max Number is:4389
【例】(*((void (*)())0))() 表示什么意思?
void (*)() 声明函数指针
让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。
另外两个元素是函数的返回类型(void)和右边圆括弧中的入口参数(本例中参数是空)。
注意本例中还没有创建指针变量-只是声明了变量类型。
(void (*)())0 把0强制转换成函数指针
(*((void (*)())0))() 调用
所以(*((void (*)())0))()的意思是:调用地址为0处的程序。
【指针函数】
一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。
返回指针的函数,一般定义格式为:
类型标识符*函数名(参数表)
int *f(x,y);
其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。
f(x,y)是函数,其值是指针。
如:char *ch();表示的就是一个返回字符型指针的函数,请看下面的例题:
【例】将字符串1(str1)复制到字符串2(str2),并输出字符串2.
#include 'stdio.h'
main()
{
char *ch(char *,char *);
char str1[]='I am glad to meet you!';
char str2[]='Welcom to study C!';
printf('%s',ch(str1,str2));
}
char *ch(char *str1,char *str2)
{
int i;
char *p;
p=str2
if(*str2==NULL) exit(-1);
do
{
*str2=*str1;
str1++;
str2++;
}while(*str1!=NULL);
return(p);
}
通过分析可得
函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,
函数指针可以用来指向一个函数。
(注:可编辑下载,若有不当之处,请指正,谢谢!)。