文档库 最新最全的文档下载
当前位置:文档库 › 函数名与函数指针

函数名与函数指针

函数名与函数指针
函数名与函数指针

一通常的函数调用

一个通常的函数调用的例子:

//自行包含头文件

void MyFun(int x); //此处的申明也可写成:void MyFun( int );

int main(int argc, char* argv[])

{

MyFun(10); //这里是调用MyFun(10);函数

return 0;

}

void MyFun(int x) //这里定义一个MyFun函数

{

printf("%d\n",x);

}

这个MyFun函数是一个无返回值的函数,它并不完成什么事情。这种调用函数的格式你应该是很熟悉的吧!看主函数中调用MyFun函数的书写格式:

MyFun(10);

我们一开始只是从功能上或者说从数学意义上理解MyFun这个函数,知道MyFun函数名代表的是一个功能(或是说一段代码)。

直到--

学习到函数指针概念时。我才不得不在思考:函数名到底又是什么东西呢?

(不要以为这是没有什么意义的事噢!呵呵,继续往下看你就知道了。)

二函数指针变量的申明

就象某一数据变量的内存地址可以存储在相应的指针变量中一样,函数的首地址也以存储在某个函数指针变量里的。这样,我就可以通过这个函数指针变量来调用所指向的函数了。

在C系列语言中,任何一个变量,总是要先申明,之后才能使用的。那么,函数指针变量也应该要先申明吧?那又是如何来申明呢?以上面的例子为例,我来申明一个可以指向MyFun函数的函数指针变量FunP。下面就是申明FunP变量的方法:

void (*FunP)(int) ; //也可写成void (*FunP)(int x);

你看,整个函数指针变量的申明格式如同函数MyFun的申明处一样,只不过--我们把MyFun改成(*FunP)而已,这样就有了一个能指向MyFun函数的指针FunP了。(当然,这个FunP指针变量也可以指向所有其它具有相同参数及返回值的函数了。)

三通过函数指针变量调用函数

有了FunP指针变量后,我们就可以对它赋值指向MyFun,然后通过FunP来调用MyFun 函数了。看我如何通过FunP指针变量来调用MyFun函数的:

//自行包含头文件

void MyFun(int x); //这个申明也可写成:void MyFun( int );

void (*FunP)(int ); //也可申明成void(*FunP)(int x),但习惯上一般不这样。

int main(int argc, char* argv[])

{

MyFun(10); //这是直接调用MyFun函数

FunP=&MyFun; //将MyFun函数的地址赋给FunP变量

(*FunP)(20); //这是通过函数指针变量FunP来调用MyFun函数的。

}

void MyFun(int x) //这里定义一个MyFun函数

{

printf("%d\n",x);

}

请看黑体字部分的代码及注释。

运行看看。嗯,不错,程序运行得很好。

哦,我的感觉是:MyFun与FunP的类型关系类似于int 与int *的关系。函数MyFun 好像是一个如int的变量(或常量),而FunP则像一个如int *一样的指针变量。

int i,*pi;

pi=&i; //与FunP=&MyFun比较。

(你的感觉呢?)

呵呵,其实不然--

四调用函数的其它书写格式

函数指针也可如下使用,来完成同样的事情:

//自行包含头文件

void MyFun(int x);

void (*FunP)(int ); //申明一个用以指向同样参数,返回值函数的指针变量。

int main(int argc, char* argv[])

{

MyFun(10); //这里是调用MyFun(10);函数

FunP=MyFun; //将MyFun函数的地址赋给FunP变量

FunP(20); //这是通过函数指针变量来调用MyFun函数的。

return 0;

}

void MyFun(int x) //这里定义一个MyFun函数

{

printf("%d\n",x);

}

我改了黑体字部分(请自行与之前的代码比较一下)。

运行试试,啊!一样地成功。

咦?

FunP=MyFun;

可以这样将MyFun值同赋值给FunP,难道MyFun与FunP是同一数据类型(即如同的int 与int的关系),而不是如同int 与int*的关系了?(有没有一点点的糊涂了?)

看来与之前的代码有点矛盾了,是吧!所以我说嘛!

请容许我暂不给你解释,继续看以下几种情况(这些可都是可以正确运行的代码哟!):

代码之三:

int main(int argc, char* argv[])

{

MyFun(10); //这里是调用MyFun(10);函数

FunP=&MyFun; //将MyFun函数的地址赋给FunP变量

FunP(20); //这是通过函数指针变量来调用MyFun函数的。

return 0;

}

代码之四:

int main(int argc, char* argv[])

{

MyFun(10); //这里是调用MyFun(10);函数

FunP=MyFun; //将MyFun函数的地址赋给FunP变量

(*FunP)(20); //这是通过函数指针变量来调用MyFun函数的。

return 0;

}

真的是可以这样的噢!

(哇!真是要晕倒了!)

还有呐!看--

int main(int argc, char* argv[])

{

(*MyFun)(10); //看,函数名MyFun也可以有这样的调用格式

return 0;

}

你也许第一次见到吧:函数名调用也可以是这样写的啊!(只不过我们平常没有这样书写罢了。)

那么,这些又说明了什么呢?

呵呵!假使我是"福尔摩斯",依据以往的知识和经验来推理本篇的"新发现",必定会由此分析并推断出以下的结论:

1. 其实,MyFun的函数名与FunP函数指针都是一样的,即都是函数指针。MyFun函数名是一个函数指针常量,而FunP是一个函数数指针变量,这是它们的关系。

2. 但函数名调用如果都得如(*MyFun)(10);这样,那书写与读起来都是不方便和不习惯的。所以C语言的设计者们才会设计成又可允许MyFun(10);这种形式地调用(这样方便多了并与数学中的函数形式一样,不是吗?)。

3. 为统一起见,FunP函数指针变量也可以FunP(10)的形式来调用。

4. 赋值时,即可FunP=&MyFun形式,也可FunP=MyFun。

上述代码的写法,随便你爱怎么着!

请这样理解吧!这可是有助于你对函数指针的应用喽!

最后--

补充说明一点:在函数的申明处:

void MyFun(int ); //不能写成void (*MyFun)(int )。

void (*FunP)(int ); //不能写成void FunP(int )。

(请看注释)这一点是要注意的。

五定义某一函数的指针类型:

就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型来申明函数指针变量。

我先给你一个自定义数据类型的例子。

typedef int* PINT; //为int* 类型定义了一个PINT的别名

int main()

{

int x;

PINT px=&x; //与int * px=&x;是等价的。PINT类型其实就是int * 类型

*px=10; //px就是int*类型的变量

return 0;

}

根据注释,应该不难看懂吧!(虽然你可能很少这样定义使用,但以后学习Win32编程时会经常见到的。)

下面我们来看一下函数指针类型的定义及使用:(请与上对照!)

//自行包含头文件

void MyFun(int x); //此处的申明也可写成:void MyFun( int );

typedef void (*FunType)(int ); //这样只是定义一个函数指针类型

FunType FunP; //然后用FunType类型来申明全局FunP变量

int main(int argc, char* argv[])

{

//FunType FunP; //函数指针变量当然也是可以是局部的,那就请在这里申明了。

MyFun(10);

FunP=&MyFun;

(*FunP)(20);

return 0;

}

void MyFun(int x)

{

printf("%d\n",x);

}

看黑体部分:

首先,在void (*FunType)(int ); 前加了一个typedef 。这样只是定义一个名为FunType函数

指针类型,而不是一个FunType变量。

然后,FunType FunP; 这句就如PINT px;一样地申明一个FunP变量。

其它相同。整个程序完成了相同的事。

这样做法的好处是:

有了FunType类型后,我们就可以同样地、很方便地用FunType类型来申明多个同类型的函数指针变量了。如下:

FunType FunP2;

FunType FunP3;

//......

六函数指针作为某个函数的参数

既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。所以,你还应知道函数指针是如何作为某个函数的参数来传递使用的。

给你一个实例:

要求:我要设计一个CallMyFun函数,这个函数可以通过参数中的函数指针值不同来分别调用MyFun1、MyFun2、MyFun3这三个函数(注:这三个函数的定义格式应相同)。

实现:代码如下:

//自行包含头文件

void MyFun1(int x);

void MyFun2(int x);

void MyFun3(int x);

typedef void (*FunType)(int ); //②. 定义一个函数指针类型FunType,与①函数类型一至

void CallMyFun(FunType fp,int x);

int main(int argc, char* argv[])

{

CallMyFun(MyFun1,10); //⑤. 通过CallMyFun函数分别调用三个不同的函数

CallMyFun(MyFun2,20);

CallMyFun(MyFun3,30);

}

void CallMyFun(FunType fp,int x) //③. 参数fp的类型是FunType。

{

fp(x);//④. 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的

}

void MyFun1(int x) // ①. 这是个有一个参数的函数,以下两个函数也相同

{

printf("函数MyFun1中输出:%d\n",x);

}

void MyFun2(int x)

{

printf("函数MyFun2中输出:%d\n",x);

}

void MyFun3(int x)

{

printf("函数MyFun3中输出:%d\n",x);

}

输出结果:略

分析:(看我写的注释。你可按我注释的①②③④⑤顺序自行分析。)

另一篇

1、函数指针:

指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。其定义格式如下所示:

返回类型标识符*返回名称(形式参数表)

{ 函数体}

返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个"变量"。例如下面一个返回指针函数的例子:float *find(float(*pionter)[4],int n)/*定义指针函数*/

{

float *pt;

pt=*(pionter+n);

return(pt);

}

main()

{

static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}};

float *p;

int i,m;

printf("Enter the number to be found:");

scanf("%d",&m);

printf("the score of NO.%d are:\n",m);

p=find(score,m);

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

printf("%5.2f\t",*(p+i));

}

学生学号从0号算起,函数find()被定义为指针函数,起形参pointer是指针指向包含4个元素的一维数组的指针变量。pointer+1指向score的第一行。*(pointer+1)指向第一行的第0个元素。pt是一个指针变量,它指向浮点型变量。main()函数中调用find()函数,将score数组的首地址传给pointer.

将字符串1(str1)连接字符串2(str2),并输出字符串1.

#include "stdio.h"

char * mystrcpy(char * str1,char * str2)

{

char * p;

p=str1;

while(*str1)

str1++;

while(*str1++=*str2++);

return p;

}

int main(void)

{

char str1[]="I LOVE SHY";

char str2[]=" chj!";

char *p;

p=mystrcpy(str1,str2);

printf("%s\n",p);

}

例3:

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,0}

};

return (&calendar[wk-1][dy-1]);

}

int main(void)

{

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",*GetDate(wk,dy));

}

2,函数指针:

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

如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上一致的。函数指针有两个用途:调用函数和做函数的参数。函数指针的说明方法为:

函数类型(*指针变量名)(形参列表);

"函数类型"说明函数的返回类型,由于"()"的优先级高于"*",所以指针变量名外的括号必不可少,后面的"形参列表"表示指针变量指向的函数所带的参数列表。

例如:

int (*f)(int x);

double (*ptr)(double x);

在定义函数指针时请注意:

函数指针和它指向的函数的参数个数和类型都应该是-致的;

函数指针的类型和函数的返回值类型也必须是一致的。

函数指针的赋值

函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了。

例如,

int func(int x); /* 声明一个函数*/

int (*f) (int x); /* 声明一个函数指针*/

f=func; /* 将func函数的首地址赋给指针f */

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

与其他指针变量相类似,如果指针变量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必须先赋值)

例1:

int max(int x,int y)

{ return(x>y?x:y);

}

int main(void)

{

int a,b,c;

int (*ptr)(int,int);

scanf("%d,%d",&a,&b);

ptr=max;

c=(*ptr)(a,b);

printf("a=%d,b=%d,max=%d",a,b,c);

return 0;

}

例2:

void FileFunc()

{

printf("FileFunc\n");

}

void EditFunc()

{

printf("EditFunc\n");

}

int main(void)

{

void (*funcp)();

funcp=FileFunc;

(*funcp)();

funcp=EditFunc;

(*funcp)();

}

例3:

ptr是指向函数的指针变量,所以可把函数max()赋给ptr作为ptr的值,即把max()的入口地址赋给ptr,以后就可以用ptr来调用该函数,实际上ptr和max都指向同一个入口地址,不同就是ptr是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你像怎么做了。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数,不过注意,指向函数的指针变量没有++和--运算,用时要小心。

3、函数指针数组

关于函数指针数组的定义

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

第一种,标准方法:

{

分析:函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是是一个数组,且其元素是一个指向函数入口地址的指针。

根据分析:首先说明是一个数组:数组名[]

其次,要说明其元素的数据类型指针:*数组名[].

再次,要明确这每一个数组元素是指向函数入口地址的指针:函数返回值类型(*数组名[])().请注意,这里为什么要把"*数组名[]"用括号扩起来呢?因为圆括号和数组说明符的优先级是等同的,如果不用圆括号把指针数组说明表达式扩起来,根据圆括号和方括号的结合方向,那么*数组名[]() 说明的是什么呢?是元素返回值类型为指针的函数数组。有这样的函数数

祖吗?不知道。所以必须括起来,以保证数组的每一个元素是指针。

}

第二种,蒙骗法:

尽管函数不是变量,但它在内存中仍有其物理地址,该地址能够赋给指针变量。获取函数方法是:用不带有括号和参数的函数名得到。

函数名相当于一个指向其函数入口指针常量。那么既然函数名是一个指针常量,那么就可以对其进行一些相应的处理,如强制类型转换。

那么我们就可以把这个地址放在一个整形指针数组中,然后作为函数指针调用即可。

完整例子:

#include "stdio.h"

int add1(int a1,int b1);

int add2(int a2,int b2);

int main(int argc,char* argv[])

{

int numa1=1,numb1=2;

int numa2=2,numb2=3;

int (*op[2])(int a,int b);

op[0]=add1;

op[1]=add2;

printf("%d %d\n",op[0](numa1,numb1),op[1](numa2,numb2));

getch();

}

int add1(int a1,int b1)

{

return a1+b1;

}

int add2(int a2,int b2)

{

return a2+b2;

}

再给出常用的C变量的定义方式:

a) 一个整型数(An integer)

b) 一个指向整型数的指针(A pointer to an integer)

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)

d) 一个有10个整型数的数组(An array of 10 integers)

e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)

f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数(An array of ten pointers to functions that take an integer argument and return an

integer )

答案是:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

函数指针

方法 指针函数和函数指针的区别 关于函数指针数组的定义 为函数指针数组赋值 函数指针的声明方法为: 数据类型标志符 (指针变量名) (形参列表); 注1:“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如: 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是一个指针变量,不像函数名称那样是死的,它可以指向任何函数,就看你想怎么做了。在程序中把哪个

C指针函数习题

C++指针函数习题 一、选择题 1.以下程序的运行结果是()。 sub(int x, int y, int *z) { *z=y-x; } void main() { int a,b; sub(10,5,&a); sub(7,a,&b); cout< #include<>

指向函数的指针详解

指向函数的指针 函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关: bool (*pf)(const string &,const string &); 这个语句将pf声明为指向函数的指针,它所指向的函数带有两个const string &类型的形参和bool 类型的返回值。 注意:*pf两侧的括号是必需的。 1.typedef简化函数指针的定义: 函数指针类型相当地冗长。使用typedef为指针类型定义同义词,可将函数指针的使用大大简化: Typedef bool (*cmpfn)(const string &,const string &); 该定义表示cmpfn是一种指向函数的指针类型的名字。该指针类型为“指向返回bool类型并带有两个const string 引用形参的函数的指针”。在要使用这种函数指针类型时,只需直接使用cmpfcn即可,不必每次都把整个类型声明全部写出来。 2.指向函数的指针的初始化和赋值 在引用函数名但又没有调用该函数时,函数名将被自动解释为指向函数的指针。假设有函数: Bool lengthcompare(const string &,const string &); 除了用作函数调用的左操作数以外,对lengthcompare的任何使用都被解释为如下类型的指针:

bool (*)(const string &,const string &); 可使用函数名对函数指针初始化或赋值: cmpfn pf1=0; cmpfn pf2=lengthcompare; pf1=legnthcompare; pf2=pf1; 此时,直接引用函数名等效于在函数名上应用取地址操作符: cmpfcn pf1=lengthcompare; cmpfcn pf2=lengthcompare; 注意:函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值。 将函数指针初始化为0,表示该指针不指向任何函数。 指向不两只函数类型的指针之间不存在转换: string::size_type sumLength(const string &,const string &); bool cstringCompare(char *,char *); //pointer to function returning bool taking two const string& cmpFcn pf;//error:return type differs pf=cstringCompare;//error:parameter types differ pf=lengthCompare;//ok:function and pointer types match exactly 3.通过指针调用函数 指向函数的指针可用于调用它所指向的函数。可以不需要使用解引用

指针函数与函数指针的区别

指针函数与函数指针的区别 一、 在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。 表示: float *fun(); float *p; p = fun(a); 注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。来讲详细一些吧!请看下面 指针函数: 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。 格式: 类型说明符* 函数名(参数) 当然了,由于返回的是一个地址,所以类型说明符一般都是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));

指向函数的指针

指向函数的指针 c/c++ 2010-11-20 13:17:02 阅读41 评论0 字号:大中小订阅首先看这个程序: #include using namespace std; void max(int a, int b) { cout<<"now call max("<b?a:b; cout<

我曾经写过一个命令行程序,有很多命令,于是构着了一个结构的数组,大概是这样 struct{ char *cmd_name; bool (*cmd_fun)(); }cmd_info_list[MAX_CMD_NUM]; 程序中得到一个用户输入的命令字符串后,就匹配这个数组,找到对应的处理函数。 以后每次添加一个命令,只需要加个函数,然后在这个数组中加一个记录就可以了,不需要修改太多的代码。 这可以算是一种用法吧。呵呵。 Windows 中,窗口的回调函数就用到了函数指针。 用VC向导 New Projects ----> Win32 Application ----> A typical "Hello World!" application 其中的WndProc 是WNDPROC 类型的函数typedef LRESULT (CALLBACK* WNDPROC)(HWND, UINT, WPARAM, LPARAM); WndProc 作为窗口的回调函数,用来填充WNDCLASSEX 结构。 WNDCLASSEX wcex; wcex.lpfnWndProc = (WNDPROC)WndProc; void ListTraverse(LinkList L,void (*visit)(int)) { Link p; p=L->next; while(p) { visit(p->data); p=p->next; } return OK; } void print(int c) { printf("%d",c); } ListTraverse(L,print); 这算是个例子吧??? #include #include #include double Add (double x, double y) { return x+y; } double Sub (double x, double y) { return x-y; } double Mul (double x, double y)

函数及指针练习题

函数练习题 【1.54】对函数形参的说明有错误的是____。 A) int a(float x[],int n) B) int a(float *x,int n) C) int a(float x[10],int n) D) int a(float x,int n) 【1.55】如果一个变量在整个程序运行期间都存在,但是仅在说明它的函数内是可见的,这个变量的存储类型应该被说明为____。 A)静态变量B) 动态变量C) 外部变量D) 内部变量 【1.56】在一个C源程序文件中,?若要定义一个只允许在该源文件中所有函数使用的变量,则该变量需要使用的存储类别是。 A) extern B) register C) auto D) static 【1.57】在C语言中,函数的数据类型是指____。 A)函数返回值的数据类型B) 函数形参的数据类型 C) 调用该函数时的实参的数据类型D) 任意指定的数据类型 【1.58】已知如下定义的函数: fun1(a) { printf("\n%d",a); } 则该函数的数据类型是____。 A)与参数a的类型相同B) void型 C) 没有返回值D) 无法确定 【1.59】定义一个函数实现交换x和y的值,并将结果正确返回。能够实现此功能的是____。 A) swapa(int x,int y) B) swapb(int *x,int *y) { int temp;{ int temp; temp=x;x=y;y=temp;temp=x;x=y;y=temp; } } C) swapc(int *x,int *y) D) swapd(int *x,int *y) { int temp;{ int *temp; temp=*x;*x=*y;*y=temp;temp=x;x=y;y=temp; } } 【1.60】求一个角的正弦函数值的平方。能够实现此功能的函数是____。 A) sqofsina(x) float x; { return(sin(x)*sin(x)); } B) double sqofsinb(x) float x; { return(sin((double)x)*sin((double)x)); } C) double sqofsinc(x) { return(((sin(x)*sin(x)); } D) sqofsind(x) float x;

函数指针的使用方法

对指针的应用是C语言编程的精髓所在,而回调函数就是C语言里面对函数指针的高级应用。简而言之,回调函数是一个通过函数指针调用的函数。如果你把函数指针(函数的入口地址)传递给另一个函数,当这个函数指针被用来调用它所指向的函数时,我们就说这个函数是回调函数。 为什么要使用回调函数呢?我们先看一个小例子: Node * Search_List (Node * node, const int value) { while (node != NULL) { if (node -> value == value) { break; } node = node -> next; } return node; } 这个函数用于在一个单向链表中查找一个指定的值,返回保存这个值的节点。它的参数是指向这个链表第一个节点的指针以及要查找的值。这个函数看上去很简单,但是我们考虑一个问题:它只能适用于值为整数的链表,如果查找一个字符串链表,我们不得不再写一个函数,其实大部分代码和现在这个函数相同,只是第二个参数的类型和比较的方法不同。 其实我们更希望令查找函数与类型无关,这样它就能用于查找存放任何类型值的链表了,因此必须改变比较的方式,而借助回调函数就可以达到这个目的。我们编写一个函数(回调函数),用于比较两个同类型的值,然后把一个指向这个函数的指针作为参数传递给查找函数,查找函数调用这个比较函数来执行比较,采用这个方法,任何类型的值得都可以进行比较。 我们还必须给查找函数传递一个指向待比较的值的指针而不是值本身,也就是一个void *类型的形参,这个指针会传递给回调函数,进行最终的比较。这样的修改可以让我们传递指向任何类型的指针到查找函数,从而完成对任何类型的比较,这就是指针的好处,我们无法将字符串、数组或者结构体作为参数传递给函数,但是指向它们的指针却可以。 现在,我们的查找函数就可以这样实现: NODE *Search_List(NODE *node, int (*compare)(void const *, void const *) , void const *desired_value); { while (node != NULL) { if (compare((node->value_address), desired_value) == 0) { break; } node = node->next; } return node; }

实验四:函数与指针

陕西理工大学 《高级语言程序设计(C)》 实验报告 院系: 班级: 学号: 姓名:

目录 实验一:C开发环境与顺序结构程序设计 (2) 1.实验目的: (2) 2.实验环境: (2) 3.实验步骤: (2) 4.实验内容: (2) 5.实验总结 (9) 实验二:分支结构与循环结构程序设计 (10) 1.实验目的: (10) 2.实验环境: (10) 3.实验内容: (10) 4.实验总结 (18) 实验三数组及数组的应用 (19) 1.实验目的: (19) 2.实验环境: (19) 3.实验内容: (19) 4.实验总结: (20) 实验四:函数与指针 (20) 1.实验目的: (21) 2.实验内容: (21) 3.实验总结 (24)

实验一:C开发环境与顺序结构程序设计 1.实验目的: (1) 了解集成开发环境VC++6.0的使用方法,理解相关命令的含义,掌握编辑、编译、连接以及运行调试的方法,掌握程序的基本结构,掌握输入输出的方式。 (2) 掌握程序设计的基本要素中的数据类型、变量、运算符以及表达式的运用。 (3) 学会正确使用逻辑运算符和逻辑表达式以及关系运算符与关系表达式,掌握在程序设计中灵活使用顺序结构。 2.实验环境: (1) 硬件环境 CPU:Inter Pentium(R)4 CPU 3.00GHz 以上 内存:2GByte (2) 软件环境 操作系统:Microsoft Windows 7 编译系统:Microsoft Visual C++ 6.0 3.实验步骤: 按如图所示流程进行实验内容的 调试。 (1) 在XP操作系统中,启动 VC++6.0编译环境; (2) 在VC++6.0编译界面输入C源 程序; (3) 选择编译、组建、执行命令进 行编译、链接和运行,并记录实验 数据; (4) 按以上方法依次输入其他源程 序并调试、运行和记录实验数据。 4.实验内容: 4.1 输入并运行下列程序,查看程序运行的结果。 #include

C# 如何跨平台调用C++的函数指针

C# 如何跨平台调用C++的函数指针! 函数指针搞C++的人应该都知道,效率高,易用性强,隐蔽代码等。在C++里面调用C++写的dll的函数指针那是在容易不过了。使用C#就稍微麻烦点了!那怎么掉呢?通过上面的第一篇文章我们知道应该使用委托 delegate。如果再高级点,定义一个函数指针结构(有点像linux的内核),也同样可以用C#调用。 提示:委托就和C++中的函数指针一样 借用一下别人的列子:在C++的一个标准Win32 api 库ccLic.dll中有一个函数void* WINAPI GetFunctionAddress(unsigned int sn);此函数通过传sn序号得到函数指针即一个函数的地址.之后再通过返回回来的地址进行其它函数的调用那么我们必须知道.一个sn号对应的函数结构如 sn=1 -> bool WINAPI CCAskServerLicenseInfo(const char* server_address,unsigned short port,PCcLic_Info plicenseinfo) 在其中 typedef struct _CcLic_Info { char ower[64]; unsigned short manage_ip; unsigned short ramained_ip; unsigned short useable_time; unsigned char type; } CcLic_Info,*PCcLic_Info; 此列的目的就是通过C#调用 CCAskServerLicenseInfo 函数. [DllImport(@"ccLic.dll")] public static extern System.IntPtr Matrix(System.UInt32 sn);//声名入口函数 //定义函数指针模型 public delegate System.Int32 CCAskServerLicenseInfoHandle(Syste m.String servername, System.UInt16 port, System.IntPtr ptr); public static LicenseInfo GetLicentInfo(String server, System.UInt16

C语言学习笔记之函数指针

C/C++学习笔记之函数指针 函数指针的概念,在潭浩强先生的《C语言程序设计》这本经典的教程中提及过,在大多数情况下我们使用不到,也忽略了它的存在。函数名实际上也是一种指针,指向函数的入口地址,但它又不同于普通的如int*、double*指针,看下面的例子来理解函数指针的概念:view plain int function(int x,int y); int main(void) { int(*fun)(int x,int y); int a=10,b=20; function(a,b); fun=function; (*fun)(a,b);…… } 第一行代码首先定义了一个函数function,其输入为两个整型数,返回也为一个整型数(输入参数和返回值可为其它任何数据类型);后面又定义了一个函数指针fun,与int*或double*定义指针不同的是,函数指针的定义必须同时指出输入参数,表明这是一个函数指针,并且*fun也必须用一对括号括起来;并将函数指针赋值为函数function,前提条件是*fun 和function的输入参数和返回值必须保持一致,否则无法通过编译。可以直接调用函数function(),也可以直接调用函数指针,二者是等效的。 回调函数(callback)是一个程序员不能显式调用的函数;通过将回调函数的地址传给调用者从而实现调用。简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。请看下面的例子: void f();//函数原型 上面的语句声明了一个函数,没有输入参数并返回void.那么函数指针的声明方法如下:void(*)(); 函数存放在内存的代码区域内,它们同样有地址,我们如何能获得函数的地址呢? 如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址。 定义一个指向函数的指针用如下的形式,以上面的test()为例: int(*fp)(int a);//这里就定义了一个指向函数的指针 函数指针绝对不能指向不同类型,或者是带不同形参的函数,在定义函数指针的时候我们很容易犯如下的错误。 int*fp(int a);//这里是错误的,因为按照结合性和优先级来看就是先和()结合,然后变成了一个返回整型指针的函数了,而不是函数指针,这一点尤其需要注意! 例如函数原型为: int fun(int*,int); 则函数指针可以声明为:int(*pf)(int*,int);当然从上述例子看不出函数指针的优点,目的主要是想引出函数指针数组的概念。我们从上面例子可以得知,既然函数名可以通过函数指针加以保存,那们也一定能定义一个数组保存若干个函数名,这就是函数指针数组。正确使用函数指针数组的前提条件是,这若干个需要通过函数指针数组保存的函

函数指针和指针函数的理解

我知道函数指针是指向函数的指针,指针函数还是指一个函数的返回值是一个指针,但下面的几道题还是感觉很迷惑。各位能否讲的详细点呢? (1)float(**def)[10]def是什么? (2)double*(*gh)[10]gh是什么? (3)double(*f[10])()f是什么? (4)int*((*b)[10])b是什么? 这样老感觉有点乱,有什么窍门可以记得并理解的清楚一点么? (1)def是一个指针,指向的对象也是一个指针,指向的指针最终指向的是10个float构成的数组. (2)gh是指针,指向的是10个元素构成的数组,数组的元素是double*类型的指针. (3)f是10个元素构成的数组,每个元素是指针,指针指向的是函数,函数类型为无参数且返回值为double.下面要讲的窍门的例子跟这个很类似. (4)b是指针,指向的是10个元素构成的数组,数组元素为int*类型的指针. 窍门如下: 如果我们碰到复杂的类型声明,该如何解析它?例如: char(*a[3])(int); a到底被声明为什么东东?指针?数组?还是函数? 分析时,从a最接近(按运算符优先级)处开始。我们看到a最接近符号是[]——注意:*比[]的优先级低。a后既然有[],那么a是数组,而且是包含3个元素的数组。 那这个数组的每个元素是什么类型呢?虽然数组a只含有a[0]、a[1]、a[2]三个元素,a[3]实际上已经越界,但在分析数组a的元素的类型时,我们正好需要形式上的元素a[3]。知道了a[3]的类型,就知道了a的元素的类型。a[3]是什么类型?是指针,因为它的前面有*.由此可知,数组a的元素是指针。 光说是指针还不够。对于指针,必须说出它指向的东东是什么类型。它指向的东东是什么,就看*a[3]是什么(a[3]是指针,它指向的东东当然是*a[3])了。继续按优先级观察,我们看到*a[3]后面有小括号,所以可以肯定*a[3]是函数。即数组a的元素是指向函数的指针。 指向的是什么类型的函数?这很明显,是入参为int、返回值为char的类型的函数。 至此解析完毕。

复杂的函数指针例子分析.doc

复杂的函数指针例子分析2008-01-26 11:38:22 分类: 一个最简单的函数指针定义如下: Void (*funcPtr) (); //funcptr是一个函数指针,它指向的函数没有参数,返回值为void 非常复杂的函数指针定义: 1.Void*(*(*fpl)(int))[10]; 解析:Void * 这是一个有10个void*类型的元素的数组。 x=* ( * fpl)(int),从而可以看出(*fpl) (int)它是一个指 针,指向一个数组。这个数组有10个void指针类型的元素。 Fpl是一个函数指针,它的参数是一个int型的参数。返回值为一个指向含有1。个void*元素的数组的指针。 2.Void*( *fpl)(int)[10]; 解析:void*X[10];今X是一个有着[。个void*类型的数组 x=( * fpl)(int); Fpl是一个函数指针,它有一个整型参数,其返回值是一个有着1()个void* 类型的元素的数组。 若是这个形式Ve i d-*-—和?块40], 则状返物=-令指向含有个v&d 类型的数组的指针U 3.Void(*fpl)(int)[10]; 解析:void X[10]->X是一个有着1()个void类型的数组 x=( * fpl)(int); Fpl是一个函数指针,它有一个整型参数,其返回值是一个有着10个void 类型的元素的数组 若是这个形式,Void ( * fpl)(int)[10],则其返回值为一个有1()个void类型的数组。 4?Float (*(*fp2)(int,int,float))(int); 解析:Float X(int)今X是一个函数,有,个整型参数,返回值是一个浮点数。

C语言——指向函数的指针

1函数类型(* 函数指针变量)();//指向函数的入口地址 一个函数是若干语句的集合,经编译后存储在函数代码存储区,并占有一片连续的存储空间,对函数指针只能用函数名赋值而无其他运算 1#include 2 3int max(int x ,int y); 4 5int main() 6{ 7int(* p)() ;//定义p是指向函数的指针变量 8int a , b , c ; 9 10p= max ;//将函数max的入口地址赋给指针变量p 11scanf("%d %d",&a ,&b) ; 12c= (* p)(a , b) ;//用指向函数的指针变量p调用函数 13printf("a = %d , b = %d , max = %d", a , b , c); 14 15return0; 16} 17 18int max(int x ,int y) 19{ 20int k ; 21k= (x> y)? x : y ; 22 23return k ; 24} 函数名作为实际参数: 1 #include 2 3int fun1(int a , int b) 4 { 5return a+b ; 6 } 7 8int fun2(int (*q)() , int x , int y) 9 { 10return (*q)(x , y) ; 11 } 12 13int main() 14 { 15int (*p)() , k ; 16 p = fun1 ;

17 k = fun2( p , 8 , 5 ) ; 18 19printf("k = %d \n" , k); //输出 13 20 21return0 ; 22 } 设置一个函数proc ,每次调用它会实现不同的功能,输入 a , b 两个数,第一次调用proc时,找出两者中最大者,第二次找出最小者,第三次调用求两数之差: 1 #include 2 3int max(int *x , int *y); 4int min(int *x , int *y); 5int a_b(int *x , int *y); 6int proc(int *x , int *y , int(*p)()); 7 8int main() 9 { 10int a , b ; 11 12printf("Enter a and b :"); 13scanf("%d %d" , &a , &b); 14 15printf("a = %d \t b = %d \n" , a , b); 16 17printf("max(%d,%d) = " , a , b); 18 proc(&a , &b , max); 19 20printf("min(%d,%d) = " , a , b); 21 proc(&a , &b , min); 22 23printf("%d - %d = " , a , b); 24 proc(&a , &b , a_b); 25 26return0 ; 27 } 28 29int max(int *x , int *y) 30 { 31int k ; 32 33 k = (*x > *y) ? *x : *y ; 34 35return k ; 36 } 37 38int min(int *x , int *y)

Keil C51中函数指针使用注意事项

Keil C51中函数指针使用注意事项 在我们的代码中大量使用了函数指针。当函数指针用在Keil C51中时,一定要注意编译器自动生成的函数调用树通常是不正确的,需要手动调整。否则可能造成无法预知的后果。 这是因为,Keil C51编译器并不把函数参数和局部变量压入堆栈中,而是放在寄存器或固定的内存位置。 C51的编译器监视函数调用的嵌套顺序,把几个函数的变量放在同样固定的位置。在C51编译器中连接器会搜索所有函数中变量占用存储区间最多的函数,然后以这个函数的变量的占用空间开辟一片空间,其他函数的变量也放在该空间中,同时实现了变量的覆盖(无相互调用)与地址的共享。例如函数A占10个字节,函数B占20个字节,函数C占15个字节,如果它们之间没有相互调用则仅需20个字节就可以满足45个字节的变量需要。 正是由于所有函数的参数和局部变量的共享一个覆盖区,函数没有相互的调用时,在执行一个函数时,会将另一个函数的变量的存储区覆盖。如果函数有调用,那么不会覆盖原来函数的局部变量的区间。 调用树(call tree)是由Keil链接器自动生成的,用于描述函数的调用关系(调用树可通过编译生成的*.M51文件的OVERLAY MAP OF MODULE部分查看,该部分详细的说明了函数的调用关系以及对覆盖存储区的使用情况)。链接器通过分析调用树来确定哪些寄存器或内存位置是可安全覆盖的。这样两个不同时调用的函数就可以共享同一块内存用于传递参数和存储局部变量。但对于函数指针来说,编译器并不知道函数指针将指向哪个函数。这导致了调用树构造出错的可能,函数的参数和局部变量也可能被错误覆盖(例如,函数A通过函数指针调用了函数B,但编译器并不知道它们之间存在调用关系,所以认为它们是可以共享同一块内存的。这样当函数A调用了函数B,回到函数A后,函数A的参数和局部变量可能已经被改变了,再往下运行就出错了)。 对此,Keil提供了链接器OVERLAY伪指令,可让用户自行修改调用树,调整函数的调用关系。 删除调用关系,命令格式: OVERLAY (sfname-caller ~ sfname-callee) OVERLAY (sfname-caller ~ (sfname-callee, sfname-callee)) 举例:OVERLAY(?PR?_FUNC?DMAIN ~ (?PR?_FUNC_A?DMAIN,?PR?_FUNC_B?DMAIN)) 意思是从FUNC函数中删除对FUNC_A和FUNC_B的调用。 添加调用关系,命令格式: OVERLAY (sfname-caller ! sfname-callee) OVERLAY (sfname-caller ! (sfname-callee, sfname-callee)) 举例:OVERLAY(?PR?_MAIN?DMAIN ! (?PR?_FUNC_A?DMAIN,?PR?_FUNC_B?DMAIN)) 意思是添加FUNC函数对FUNC_A和FUNC_B的调用。 可在链接命令行输入命令。或在Keil集成开发环境中,在“BL51 Misc”-“Overlay”中填入()中的内容。

将0转型为“指向返回值为void的函数的指针” (void (x)())0

(void (*)())0 的含义 (void (*)())0 的含义: 1. fp是一个指针{有*},她指向返回值为void{有(void)}类型的函数{有()}:void (*fp)(); 调用方式简写为:(*fp)(); 2. 制作其对应的类型强制转换符:void (*)() 3. 存储位置为0 的强制转换为一个指向返回值为void类型的函数的指针:(void (*)())0 4. 用上式代替fp,从而实现调用存储位置为0的子例程:(*(void(*)())0)(); 5. 利用typedef简化:typedef void (*funcptr)(); (*(funcptr)0)(); (void (*)())0 的含义:实际上就是将地址0强制转换为一个指向返回值为void类型的函数的指针。 下面将相关基础知识进行介绍,其中参考了网上一些文章,名单不再列出,谢谢各位大虾的贡献: 1、c语言的声明 2、类型转换符的制作 3、signal函数分析 4、typedef用法 5、const用法 6、typedef的好处 1 C语言的声明 声明由两部分组成:类型以及声明符: float f,g; float ((f));//对其求值时,((f))的类型为浮点型,可以推知,f也是浮点型 float *g(),(*h)();//g是函数,该函数的返回类型为指向浮点数的指针 //h是个指针,且是一个函数指针,该指针指向函数返回值,该返回值是一个float型 (*fp)()简写为fp()//函数调用方式,其中fp为函数指针 *((*fp)())简写为*fp()//函数返回值为某个类型的指针 、2 类型转换符制作 类型转换符制作: 1、去掉声明中的变量名、分号; 2、将剩余部分用括号"封装"起来 float (*h)(); --> (float (*)())//指向返回值为float型的函数指针的类型转换符(*0)();//返回值为void类型的函数指针 如果fp是一个指向返回值为void类型的函数的指针,那么(*fp)()的值为 void,fp的声明如下:void (*fp)(); 因此可以用下式完成调用存储位置为0的子例程:void (*fp)(); (*fp)(); 这种写法的代价是多声明了一个哑变量,我们常将0转型为“指向返回值为void的函数的指针”:(void (*)())0 用上式代替fp,从而得到:(*(void(*)())0)(); typedef void (*funcptr)(); 将0转型为“指向返回值为void的函数的指针”-----(void (*)())0 (*(funcptr)0)(); 3 signal函数

函数与指针编程题

1.编一程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该串。请用指针完成。 答案:#include "stdio.h" main() { static char x[]="computer": char *p; for(p=x;p void main() { char a[100],*p; int n=0; p=a; gets(p); for(;*p!='\0';p++) { n++; } printf("%d",n); } 3.下面findmax函数将计算数组中的最大元素及其下标值和地址值,请编写*findmax()函数。并将程序调试运行 #include *findmax(int *s,int t,int *k) { } main() { int a[10]={12,23,34,45,56,67,78,89,11,22},k,*add; add=findmax(a,10,&k); printf("%d,%d,%o\n",a[k],k,add); } 答案:#include int *findmax(int *s,int t,int *k) { int max; max=s[0]; for(int i=0;i

*k=i; } } return k; } void main() { int a[10]={12,23,34,45,56,67,78,89,11,22},k,*add; add=findmax(a,10,&k); printf("%d,%d,%o\n",a[k],k,add); } 4. 用指针方法处理。有一字符串,包含n(n>2)个字符。写一函数,将此字符串中从第2个字符开始的全部字符复制成为另一个字符串。 5. 用指针方法处理。有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。 #include #include int main() { int m,len; char str1[100],*p,*q; p=str1; q=p; gets(p); len=strlen(p); printf("input m(m int search(int a[],int n,int x) { int i; for(i=0;i<5;i++)

函数指针和指针函数

在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址。可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。 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);

相关文档
相关文档 最新文档