永发信息网

C语言中函数指针用法

答案:4  悬赏:50  手机版
解决时间 2021-02-18 17:45
C语言中函数指针用法
最佳答案
函数在内存中有一个物理位置,而这个位置是可以赋给一个指针的。一零点函数的地址就是该函数的入口点。因此,函数指针可被用来调用一个函数。函数的地址是用不带任何括号或参数的函数名来得到的。(这很类似于数组地址的得到方法,即,在只有数组名而无下标是就得到数组地址。)

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

为了说明一个变量 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 列的值。读者可仔细领会元素值的各种不同的表示方法。 应该注意指针数组和二维数组指针变量的区别。 这两者虽然都可用来表示二维数组,但是其表示方法和意义是不同的
全部回答
在c语言中,指针被广泛使用,而函数指针是最为高级的用法之一,也是容易疑惑的地方之一。 看下面这段代码: #include void f(int a, int* output) { printf("a = %d\n", a); *output = a + 1; } typedef void (*func)(); int main() { func f = f; int ret = 0; f(3, &ret); printf("ret = %d\n", ret); return 0; } 上面看出 func 的类型是与f的类型不匹配的,这样可以通过编译吗? 答案是: 可以的。由于在c语言中编译函数的时候,是仅仅将其函数名作为该函数的 唯一标识,为其分配相应地址。所以虽然func 与 f的类型不一致,但是对于编译器看来 都是两个地址,是无所谓的。 用上面的特点,可以写出非常通用的函数指针类型, typedef int (*func)(); 这里之所有要有返回值,是用来标识该函数是否执行成功的错误代码标志。 随说做了有一段时间的c了,但尽然没有搞明白函数指针的用法,见到了也没有好好研究,今天终于有时间了,在网上搜了一下,终于弄懂了.原来就是定义了一个指针变量,只不过形式有点怪罢了.其实还是当成指针用就行了! 一般有两种用法: 1定义函数指针 int (*functionpoint)(int, int)----这只是定义了一个指向函数的指针 int a(int a,int b)----------------这是与之相符的函数原型 void main()-----------------------使用 { functionpoint = a;------------先赋值 functionpoint(1,2);----------调用 } 2用typedef定义使用 typedef int (*functionpoint)(int,int);----------定义了一种类型名为functionpoint的指针 int a(int a, int b)-----------------------------函数原型 void main() { functionpoint fun;---------------------------定义指针 fun = a;-------------------------------------赋值 fun(1,2);---------------------------------使用 } 函数就是这个函数的指针.
直接给你举个例子吧: #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; }
函数名 是 程序在执行时, 函数所占内存单元块的 首地址 的别称。 就像数组一样。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
北京理工大学良乡校区-行政楼地址在哪,我要
纯商业用房楼盘项目必须取竣工验收合格证后,
如何做好全文字型PPT,ppt教程
血液病都有哪些
买了设备出了质量问题怎么维权
车祸后,对方交警过来拍了照片但是没有现场责
商贸城公寓楼我想知道这个在什么地方
【金融机构发现或者有合理理由怀疑客户】金融
小高考3个D到底能不能录得到
川流不息足疗养身会所NO.2地址有知道的么?有
改派一定要在报到前吗?不是说2年时间内都可
我用财付通充qb可是充太多了显示要添加银行卡
新飞飞各种飞行器初速度
用英语怎么写下面的短语?在中学学习两个男医
中国石化埃索加油站(同集南路辅路)在哪里啊,
推荐资讯
会声会影x5插入avi视频后画面倾斜变灰
怀来县盐业专营有限公司我想知道这个在什么地
恶魔少爷别吻我另有第三季第四季吗什么时候播
求越剧名家名段MP3格式的文件
公司挂名监事有风险吗
Most people enjoy hiking.
李记麻辣烫在哪里啊,我有事要去这个地方
绝对值大于二且不大于六的非整数是多少打错了
原来在中国人寿买的保险,现在想加意外险能加
微信收不到图片怎么回事
香油在英文里怎么写
秦皇岛石门寨镇除了老君顶,蟠桃峪,傍水涯,
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?