微软官方MSDN原版Win10系统下载

现在位置: 首页  > 系统教程  > 系统帮助

如何定义函数指针数组

时间:2024-09-21 03:10:38   

大家好,今天Win10系统之家小编给大家分享「如何定义函数指针数组」的知识,如果能碰巧解决你现在面临的问题,记得收藏本站或分享给你的好友们哟~,现在开始吧!

生意如何小账本专业版-小商户销售和存货记账系列软件最新版本下载

1.指向函数指针的定义形式数组篇


  (一) 用函数指针变量调用函数
 可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例:
1 #include 
 2 #include 
 3 
 4 int main()
 5 {
 6 int max(int,int);
 7 int (*p)(int,int);
 8 int a,b,c;
 9 p = max;
10 scanf("%d,%d",&a,&b);
11 c = (*p)(a,b);
12 printf("a=%d,b=%d,max=%d\n",a,b,c);
13 return 0;
14 }
15 
16 int max(int x,int y)
17 {
18 int z;
19 if(x>y) z = x;
20 else z = y;
21 return(z);
22 }
 main函数中的" c = max(a,b); " 包括了一次函数的调用。每一个函数都占用一段内存单元。因此,可以用一个指针变量指向一个函数,通过指针变量来访问它指向的函数。
 第7行:int (*p)( int,int ); 用来定义 p 是一个指向函数的指针变量,该函数有两个整形参数,函数值为整形。注意 *p 两侧的括号不可省略,表示 p 先与 * 结合,是指针变量,然后再与后面的 ( ) 结合,表示此指针变量指向函数,这个函数值 (即函数的返回值) 是整形的。如果写成 int *p ( int,int ) ,由于( )的优先级高于 *,它就成了声明一个函数p( 这个函数的返回值是指向整形变量的指针)。
 赋值语句 p = max ; 作用是将函数 max 的入口地址赋给指针变量p。和数组名代表数组首元素地址类似,函数名代表该函数的入口地址。这时 p 就是指向函数 max 的指针变量,此时 p 和 max都指向函数开头,调用 *p 就是调用 max 函数。但是p作为指向函数的指针变量,它只能指向函数入口处而不可能指向函数中间的某一处指令处,因此不能用 *(p + 1)来表示指向下一条指令。
 注意:
 (1) 指向函数的指针变量的一般定义形式为:
 数据类型 (*指针变量名)(函数参数列表)
 这里数据类型就是函数返回值的类型
 (2) int (* p) ( int,int ); 它只是定义一个指向函数的指针变量 p, 它不是固定指向哪一个函数的,而只是表示定义这样一个类型的变量,它是专门用来存放函数的入口地址的。在程序中把哪一函数(该函数的值应该是整形的,且有两个整形参数)的地址赋给它,他就指向哪一个函数。在一个函数中,一个函数指针变量可以先后指向同类型的不同函数。
 (3) p = max; 在给函数指针变量赋值时,只需给出函数名而不必给出函数参数,因为是将函数的入口地址赋给 p ,而不涉及 实参和形参的结合问题,不能写成 p = max(a,b);
 (4) c = (*p)(a,b) 在函数调用时,只需将( *p ) 代替函数名即可,后面实参依旧。
 (5) 对于指向函数的指针变量,像 p++ ,p+n.....是无意义的。
 (二) 用指向函数的指针作为函数参数
 函数指针变量通常的用途之一就是把指针作为参数传递到其他函数。
 函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量,也可以是指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。
 void sub ( int ( *x1) (int), int (*x2) (int,int) )
 {
 int a,b,i,j;
 a = (*x1)(i); /* 调用 f1 函数 */
 b = (*x2)(i)(j); /* 调用 f2 函数 */
 }
 如果实参为两个 函数名 f1 和 f2. 在函数首部定义x1、x2为函数指针变量,x1指向的函数有一个整形形参,x2指向的函数有两个形参。i 和 j 是函数f1 和 f2所要的参数。函数sub的形参 x1、x2(指针变量)在函数 sub 未被调用时并不占用内存单元,也不指向任何函数。在sub被调用时,把实参函数 f1 和 f2的入口地址传给形式指针变量 x1 和 x2.
 既然在 sub 函数中要调用 f1 和 f2 函数,为什么不直接调用f1 和 f2而要用函数指针变量呢? 确实,如果只是用到f1 和 f2 函数,完全可以在sub函数中直接调用f1 和 f2,而不必设指针变量 x1 和 x2。 但是,如果在每次调用sub时,调用的函数不是固定的,下次是f3 和 f4,再是f5 和 f6...这时用指针变量就比较方便了。

2.如何定义一个指向函数的指针数组


  这个用typedef可以完成: 
先定义一个函数指针的类型:typedef void (*pFUN)(); 
然后用这个类型pFUN定义一个数组 
pFUN ptr[5];//[]里的数字是数组元素的个数,依情况而定:这儿用5做例子 
这样ptr就是一个指向函数指针的数组。 
对于“把一个指针强制定义”这我还没听过这个说法,只听过把指针强制转换成某个类型的指针: 
强制类型转换用()运算,仍然用上面的定义类型。 
例如: 
void *p;//p是一个void指针 
pFUN ptr;//ptr是一个指向void函数的指针 
ptr=(pFUN)p;//把p强制转换成指向void函数的指针,然后就可以把它赋值给ptr指针。 
不用typedef也可以,只要合并就可以了: 
void (*ptr[5])();//这样ptr就是一个函数指针数组了.这样看很费解的!不如用typedef。
对于强制类型转换最好还是用typedef,那样可读性好。 
而且个人认为指针没有那种基本类型(指向函数的指针类型),那是一种新的类型。所以要先定义那种类型才行。 
用typedef定义新类型又没有什么副作用,而且容易读懂,何必非要不用typedef呢?!没必要把简单的问题复杂化!!
程序代码的可读性是很重要的,写复杂的类型而不用typedef是很令人反感的!

3.如何定义一个指向数组的指针


  指针数组是一种特殊的数组,指针数组的数组元素都是指针变量。指针数组的定义格式为:
类型名称
*数组名称[数组长度];
例如:float
*pf[3];
因为下标运算符[]的优先级高于指针运算符*,上述定义等价于:float
*
(pf[3]);
说明pf是一个含有3个元素的数组,数组元素为指向float型变量的指针变量。
又如:
int
*pn[5];
/*定义一个5个元素的指针数组,数组元素为指向int型变量的指针变量*/
char
*pc[10];
/*定义一个10个元素的指针数组,元素为指向char型变量的指针变量*/
不论指针数组是什么类型,指针数组的每个数组元素都用来保存一个地址值,在TurboC下,每个数组元素是一个unsigned
int型变量,占用2个字节。
指针数组定义后,可以使数组元素指向一个变量和其他数组的首地址。下面是一个指针数组定义和引用的例子。
main()
{
int
i;
char
c1[]="How";
char
c2[]="are";
char
*c3="you";
char
*pArray[3];
pArray[0]=c1;
pArray[1]=c2;
pArray[2]=c3;
for(i=0;i<3;i++)
printf("%s
",
pArray[i]);
}
程序运行的结果为:
How
are
you
说明:
(1)程序中c1,c2被定义为字符数组并初始化;c3是一个指针变量,指向字符串所在字符数组的首地址。
(2)语句char
*pArray[3];定义了三个元素的指针数组pArray,数组元素是指向char型变量或数组的指针变量。
(3)语句pArray[0]=c1;将字符数组c1的首地址赋给pArray[0],指针变量pArray[0]指向了c1的首地址。
(4)for循环中,语句printf("%s
",
pArray[i]);依次打印了三个字符数组的内容。比如,pArray[0]里存放了c1的首地址,printf("%s
",
pArray[0])和printf("%s
",
c1)的作用是相同的。
字符数组c1,c2,c3和指针数组pArray的内存情况如下图(图中的数组首地址值是假设的值)。
指针数组pArray占用了从FFC0开始的6个字节。char型变量占用1个字节,因此字符数组c1,c2,c3均占用4个字节(包括字符串结束符0)。pArray[0]里存放了字符数组c1的首地址FF10,使pArray[0]指向c1。pArray[1]里存放了字符数组c2的首地址FF50,使pArray[1]指向c2。pArray[2]里存放了字符数组c3的首地址FF70,使pArray[2]指向c3。

以上就是关于「如何定义函数指针数组」的全部内容,本文讲解到这里啦,希望对大家有所帮助。如果你还想了解更多这方面的信息,记得收藏关注本站~

『本②文★来源Win10系统之家,转载请联系网站管理人员!』

相关文章

  • 如何定义函数指针数组

    如何定义函数指针数组

    1.指向函数指针的定义形式数组篇(一)用函数指针变量调用函数可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变...
  • 如何把数组赋值指针

    如何把数组赋值指针

    1.怎么将一组数组赋值给指针,比如,a[][3]={2,4,5,6,7,8,9,10,11}*p(3)我要直接赋值的指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念和使用上,多维数组的指针比一维数组的指针要复杂。1、二维...
  • 如何定义动态二维数组

    如何定义动态二维数组

    1.C语言中如何定义动态二维数组并输出可以按照下面步骤进行定义二维数组并输出:1定义二维指针。2确定数组维数,即行数和列数。3申请行数个一维指针大小空间,并赋值给二维指针。4对于每个一维指,申请列数个元素的空间,并...
  • excel如何定义函数

    excel如何定义函数

    1.excel进行自定义函数操作的教程如何自定义Excel中的函数?接下来,我&#039;我将给你带来一个excel&#039;的自定义函数操作,供您参考。excel进行自定义函数操作的教程:自定义函数操作第一步:点击工具中的宏,选择...