C语言中函数指针用法

作者&投稿:倪从 (若有异议请与网页底部的电邮联系)
C语言中的函数指针~

函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。


int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。
注2:函数括号中的形参可有可无,视情况而定。
下面的程序说明了函数指针调用函数的方法:
例一、
#include
int max(int x,int y){ return(x>y?x:y); }
void main()
{
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算,用时要小心。


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


其实还是指针,只是指向的内容和声明方法不同而已

1. PF ff(int)是什么意思?
ff 是函数名,括号里的int是函数参数, PF是函数返回值。所以这句声明的意思是ff是一个函数,他有1个int类型参数,返回PF类型。其中PF是一个函数指针,指向的函数有两个参数(int*,int),返回int类型。 你完全可以把PF换成int,PF只是一个返回类型。请仔细读两遍。

函数在内存中有一个物理位置,而这个位置是可以赋给一个指针的。一零点函数的地址就是该函数的入口点。因此,函数指针可被用来调用一个函数。函数的地址是用不带任何括号或参数的函数名来得到的。(这很类似于数组地址的得到方法,即,在只有数组名而无下标是就得到数组地址。)

怎样说明一个函数指针变量呢 ?

为了说明一个变量 fn_pointer 的类型是"返回值为 int 的函数指针", 你可以使用下面的说明语句:

int (*fn_pointer) ();

为了让编译器能正确地解释这句语句, *fn_pointer 必须用括号围起来。若漏了这对括号, 则:

int *fn_pointer ();

的意思完全不同了。fn_pointer 将是一个函数名, 其返回值为 int 类型的指针。

2:函数指针变量

在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); 调用函数的一般形式为: (* 指针变量名 ) ( 实参表 ) 使用函数指针变量还应注意以下两点:

a. 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。

b. 函数调用中 "(* 指针变量名 )" 的两边的括号不可少,其中的 * 不应该理解为求值运算,在此处它只是一种表示符号。

3:指针型函数

前面我们介绍过,所谓函数类型是指函数返回值的类型。 在C语言中允许一个函数的返回值是一个指针 ( 即地址 ) ,这种返回指针值的函数称为指针型函数。

定义指针型函数的一般形式为:

类型说明符 * 函数名 ( 形参表 )

{

…… /* 函数体 */

}

其中函数名之前加了 "*" 号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。

如:

int *ap(int x,int y)

{

…… /* 函数体 */

}

表示 ap 是一个返回指针值的指针型函数, 它返回的指针指向一个整型变量。下例中定义了一个指针型函数 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() 只是函数头部分,一般还应该有函数体部分。

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_n

ame(int n)

{

static char *name[]={ "Illegal day",

"Monday",

"Tuesday",

"Wednesday",

"Thursday",

"Friday",

"Saturday",

"Sunday"};

return((n<1||n>7) ? name[0] : name[n]);

}

本程序是通过指针函数,输入一个 1 ~ 7 之间的整数, 输出对应的星期名。指针数组的说明与使用一个数组的元素值为指针则是指针数组。指针数组是一组有序的指针的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。

指针数组说明的一般形式为: 类型说明符 * 数组名 [ 数组长度 ]

其中类型说明符为指针值所指向的变量的类型。例如: int *pa[3] 表示 pa 是一个指针数组,它有三个数组元素, 每个元素值都是一个指针,指向整型变量。通常可用一个指针数组来指向一个二维数组。 指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组。图 6—6 表示了这种关系。

int a[3][3]={1,2,3,4,5,6,7,8,9};

int *pa[3]={a[0],a[1],a[2]};

int *p=a[0];

main()

{

int i;

for(i=0;i<3;i++)

printf("%d,%d,%d/n",a[i][2-i],*a[i],*(*(a+i)+i));

for(i=0;i<3;i++)

printf("%d,%d,%d/n",*pa[i],p[i],*(p+i));

}

本例程序中, pa 是一个指针数组,三个元素分别指向二维数组 a 的各行。然后用循环语句输出指定的数组元素。其中 *a[i] 表示 i 行 0 列元素值; *(*(a+i)+i) 表示 i 行 i 列的元素值; *pa[i] 表示 i 行 0 列元素值;由于 p 与 a[0] 相同,故 p[i] 表示 0 行 i 列的值; *(p+i) 表示 0 行 i 列的值。读者可仔细领会元素值的各种不同的表示方法。 应该注意指针数组和二维数组指针变量的区别。 这两者虽然都可用来表示二维数组,但是其表示方法和意义是不同的

*func()是一个指向函数的指针,它指向的是函数的入口地址,题目问的是返回值,返回的应该就是一个指针,由于前面写了int
所以返回的是一个指向整型变量的指针~

函数名 是 程序在执行时, 函数所占内存单元块的 首地址 的别称。

就像数组一样。

直接给你举个例子吧:
#include<stdio.h>
int max(int a, int b)
{
return a>b ? a: b;
}
int main()
{
int a=10;
int b=11;
int maxnum;
int (*pfun)(int x, int y);
pfun = max;
maxnum = pfun(a, b);
printf("%d\n", maxnum);
return 0;
}

内存地址用法就相当于快递取件与送件时目的地。用法。。。


C语言中指针函数和函数指针的区别?举例详细说明
首先,指针函数是返回指针类型的函数,如`int* max(int x, int y)`,它返回x和y中的最大值的指针地址。而函数指针则存储函数的地址,如`int (*p)(int, int)`,`p = add;`这行代码将add函数的地址存储在指针p中,以便后续调用。关键的区别包括:1. 指针函数返回的是指向数据的指针,函数指...

C语言指针函数和函数指针详细介绍
函数指针是指指向某个具体函数的指针变量,在程序设计时可以用来调用某个特定函数或者做某个函数的参数。其形式一般如图: 03 指针函数与函数指针本质上的区别是,指针函数是一个带指针的函数,总的来说还是一个函数,如图就是一个带*name指针的函数 04 函数指针是指向函数的指针变量,本质上还是一个指针,其格式如下...

c语言函数指针的作用。
1、实现面向对象编程中的多态性。2、回调函数。函数指针是指向函数的指针变量。因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了...

c语言中函数指针是什么 有什么用 举个实例
函数指针有两个用途:调用函数和做函数的参数。函数指针的声明方法为:返回值类型 ( * 指针变量名) ([形参列表]);如:int func(int x); \/* 声明一个函数 *\/ int (*f) (int x); \/* 声明一个函数指针 *\/ f=func; \/* 将func函数的首地址赋给指针f *\/ 或者使用下面的方法将函数地址赋...

如何定义指向函数的指针?
1、int func(int x); \/* 声明一个函数 *\/ 2、int (*f) (int x); \/* 声明一个函数指针 *\/ 3、f=func; \/* 将func函数的首地址赋给指针f *\/ 二、函数指针的用法:函数指针的应用:(*指针变量名)(参数列表)如:int c=(*ptr)(a,b);\/* 函数指针 的使用*\/ 在C语言中,函数...

C语言中,指针函数和函数指针有什么区别?
指针函数本质上是函数,是一个返回类型为指针的函数,如:int* max(int *array,int n){ \/\/找最大值的地址 return 最大值的地址;} max就是一个指针函数。而函数指针本质上是指针,是指向函数的指针,如:int (*funp)(int a,int b);funp就是一个函数指针,可以用它指向一个返回类型为int、...

c语言中void的意思
在C语言中,void是一种特殊的数据类型,用于表示无类型或没有值的情况。它用来指示函数不返回任何值,或者指示指针没有特定的数据类型。void在c语言中主要有两个常见的用法:函数返回类型:如果函数不返回任何值,可以将其返回类型声明为void。指针类型:在C中,可以使用void指针来存储任何类型的指针。这...

C语言 指针函数 函数指针 什么区别联系?最好有例子?一定采纳
函数指针的声明形式是T (*p)(...),其中*p使用括号括起来的原因是函数类型解析的优先级高于指针的解析,故使用括号防止解析成上面的指针函数(其实这两个之间就相差了一对括号)。函数指针可以绑定到与其返回值和参数类型都相同的函数上。比如:int foo(int, double); \/\/ 函数声明int (*bar)(int,...

c语言中函数名就是函数指针吗?
是的。c语言中, 函数名也称为函数的指针,所以c语言中函数名就是一个指针。“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的...

c语言中指针怎么使用?
1、使用场景 使用指针时,必须将它指向一个变量的地址或者为它分配空间方能使用,如下所示:include<stdio.h> include <stdlib.h> int main(int argc, char const *argv[]){ int a[5]={0,1,2,3,4};int *b,*d;int c=2;int *e=a; \/\/e指向a数组首地址 \/\/*b=2; 无法直接初始...

金州区18338925832: C语言中的函数指针 -
耿知严立: 函数指针是定义一个指向函数的指针,形式为:void (*p)(void); 一般用法:int fun1(int x); int fun2(int x); char fun3(int x); int fun4(char x); int main(void) { int (*p)(int x);p=fun1; //指向fun1 p(2) //这时等价于fun1(2) p=fun2; //也可以指向fun2 . .但...

金州区18338925832: 在C语言中,指向函数的指针怎么调用函数? -
耿知严立: 如果存在函数指针p,以*p取函数指针的值,然后加上参数列表调用即可. 即 ret = (*p)(arg_list); 如,p为int (*)(int)类型的函数指针,那么 int a = (*p)(10); 这样就是一次典型的函数指针调用.

金州区18338925832: C语言指针的用法 -
耿知严立: #include<stdio.h> #include<math.h> #include <conio.h> void sort(char *a[],int n) { int i,j; char *temp; for(i=0;i<n;i++) for(j=i+1;j<n;j++) if(strcmp(a[i],a[j]<0)) { temp=a[i]; a[i]=a[j]; a[j]=temp; } }int main() { char *a[3]; int i; for(i=0;i<3;i++) a[i] = (char *)malloc(...

金州区18338925832: 求C语言中指针的用法 -
耿知严立: 电脑程序中,不管是什么东西,他都对应有一个地址,而指针的作用是指向这个地址.例如int a=0; a的内容是0,但是在电脑中的内存地址就是其他,假如是2000,那么指针指向的就是这个2000的值.继续刚才的例子int *p;p=&a;这个时候p就指向了a的地址2000,如果想借助p来访问a,就需要在p前面添加上*号,如*p的内容就是0了,也是a的内容.

金州区18338925832: c语言指针用法 -
耿知严立: int top 应不属于指针的范畴了,而是int的常用变量的定义,这个top要看是怎么用法,如果按照负数,0,正数来使用的话,可以判断它是用来做为这个类的一个特殊的定义标识; 如果这个变量是一个循环里面的的计数器的话(意思就是随着循环的次数增多或者减少)就可以判断这个循环成功的执行的多少次了 Reader是一个类名,意思类也是一种数据类型 就像整型int一样是一个数据类型名称 Reader read[Maxr];意思是定义了一个这样类的数组变量,Marxr 估计就是一个宏定义好的一个数值 为什么可以这样定义呢,应为class可以包含任意的数据类型(和c里面的struct一样),也包括外部class

金州区18338925832: C语言中函数指针用法 -
耿知严立: 在C语言中,指针被广泛使用,而函数指针是最为高级的用法之一,也是容易疑惑的地方之一. 看下面这段代码: #include <stdio.h> void F(int a, int* output) { printf("a = %d\n", a);*output = a + 1; } typedef void (*FUNC)(); int main() { FUNC f = F;...

金州区18338925832: C语言——指向函数的指针 -
耿知严立: c语言中叫做回调函数,将函数指针(如max)作为函数的参数,函数(如fun)中调用这个参数指向的函数,调用函数(fun)时看情况而给函数传入不同的函数指针 例如fun(a,b,min),那么fun函数调用执行三个参数就调用min函数 参数的定义要与传入的函数指针相匹配 例如fun(int,x,int y,(*p)(int,int)) 那么调用fun(a,b,min)时,min的参数必须是(int ,int)

金州区18338925832: c语言中函数指针是什么 有什么用 举个实例 -
耿知严立: 函数指针是指向函数的指针变量. 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数.函数指针有两个用途:调用函数和做函数的参数.函数指针的...

金州区18338925832: c语言中指针怎么用 -
耿知严立: c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上.因此,说指针是c语言的灵魂,一点都不为过.指针就是地址.计算机中的内存都是编址的,就像你家的地址一样.C 中函数调用是按值传递的,传入参数在子函数中只...

金州区18338925832: C语言 函数指针 的调用问题?函数指针 怎么用?最好有例子.. -
耿知严立: 有函数: int fun(int a,int b); 要定义指向该函数的指针 对比指向 int a; 的指针 int *p; p = &a; p的定义是怎么来的?首先要保证p是一个指针类型 写下(*p),然后,考虑下p的基类型,p的基类型就是变量a的类型int 将int 放在(*p)前面就行了 ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网