18.c/c++程序员面试宝典-函数指针

18.c/c++程序员面试宝典-函数指针

在程序运行中,函数是程序的算法指令部分,它们和数组一样也占用存储空间,也都有相应的地址。编程者可以使用指针变量指向数组的首地址,同样,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指针变量称为函数指针。



面试题89 什么是函数指针?如何使用函数指针***


分析:函数指针就是指向函数的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型及形参表确定,而与函数名无关。函数指针的示例代码如下:

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就代表同一个函数。由于函数指针是指向存储区中的某个函数,因此可以通过函数指针调用相应的函数。通过函数指针调用函数的示例代码如下:

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);

}

printf("the max number is:%d",a);

}

f(int x,int y)  //定义比较函数

{

int z;

z=(x>y)?x:y;

return (z);

}


上面代码的运行结果如下:

343 -45 4389 4236 1 -534 988 555 789

the max number is:4389


【答案】函数指针就是指向函数的存储空间地址的指针。可以对函数指针进行赋值并且通过函数指针来调用函数。



面试题90 指针函数和函数指针的区别***


分析:函数不仅可以返回整型、字符型等数据类型的数据,还可以返回指针类型的数据,使其指向某个地址单元。返回指针的函数称为指针函数。指针函数的定义示例代码如下:

int *test(x,y);


上面代码中x,y是形式参数,test是函数名,调用函数后会返回一个指向整型数据的地址指针。test(x,y)是函数,它的值是指针。


指针函数可以返回指针值,它的使用示例代码如下:

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)   //定义返回指针的函数

{

nt i;  

char *p;  //定义指针

p=str2;

if(*str2==NULL)  exit(-1);

do

{

*str2=*str1;

str1++;

str2++;

}

while(*str1!=NULL);

return(p);   //返回指针

}


上面代码中,函数char *ch()表示的就是一个返回字符型指针的函数。


【答案】函数指针是一个指向函数的指针。它的本质是一个指针,而指针函数只是说明它是一个返回值为指针的函数,它的本质是一个函数。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值