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

原创 2015年11月17日 19:57:45

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()表示的就是一个返回字符型指针的函数。


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



c++程序员面试宝典

静态存储区 static静态变量 全局变量 栈 局部变量 堆 动态分配的 栈堆:循环的迭代用中 数据量大 则溢出 239 static作用:静态变量的生存周期和作用域...
  • cyuyanchenxi
  • cyuyanchenxi
  • 2017年03月20日 23:28
  • 549

C/C++程序员面试宝典-1

第2部分 C/C++基础知识 1. C++中的基本数据类型: 2. C++中的整型: 3. C++中的常见常量 常量按照数据类型的不同分为整型常量,浮点型常量,字符型常量,还有...
  • benpaobagzb
  • benpaobagzb
  • 2015年09月14日 16:43
  • 674

2017 java程序员面试宝典

转自点击打开链接 1:JDK与JRE JDK:JAVA Development Kit, java开发工具包; 包括各种类库和工具,当然也包括JRE JRE:JAVA Runtime Environm...
  • bigheadyushan
  • bigheadyushan
  • 2017年08月30日 00:09
  • 978

《程序员面试宝典3》大量错误(50+)纠正表

《程序员面试宝典》第3版大量错误纠正表        以前随手翻了翻,想写这篇文章没有写,现在完整看了下就记录下来了。找工作的同学大部分都会看《程序员面试宝典》,本来看过去就可以了。但我还是要把...
  • hilyoo
  • hilyoo
  • 2009年08月20日 15:43
  • 22365

程序员面试宝典(第五版)里的错误

为了准备找工作,买了本《程序员面试宝典》看看,结果发现这本书里面错漏的地方实在是太多了。记录一下,希望对后来的人有所帮助。 1.184页,“面试官会节和程序对你的思维能力进行考量。”中“节”字写错,...
  • ww1473345713
  • ww1473345713
  • 2016年03月21日 22:58
  • 3878

《程序员面试宝典》学习记录6

印象笔记同步分享:《程序员面试宝典》学习记录6 《程序员面试宝典》学习记录6 第10章 面向对象 10.1 面向对象的基本概念 考点1:面向对象三大特性 1)...
  • u010555622
  • u010555622
  • 2014年08月28日 22:34
  • 1623

C/C++经典面试题总结摘选 C/C++程序员面试宝典(一)

=================================================================================== 1. char p[]和cha...
  • shihui512
  • shihui512
  • 2013年06月04日 21:30
  • 2961

【JAVA程序员面试宝典】2天看完了-谈谈我的理解吧

今天开启阅读了这本书,中断了原计划中算法中级层次的系统性训练,我觉得先看看面试题吧。先给这本书A掉再说。 阅读了一天,大概阅读了一半,有点失望,因为这本书讲解的面试都是基础中的基础,我看着都着急,作者...
  • superMarss
  • superMarss
  • 2014年09月07日 23:44
  • 5346

.net概述---from《C#与.net程序员面试宝典》

1、介绍APS.NET ASP.NET不是一种语言,而是
  • wangyajing1991
  • wangyajing1991
  • 2014年08月14日 14:14
  • 450

《Java程序员面试宝典(第4版)》 试读感想

《Java程序员面试宝典(第4版)》 试读感想         谈到Java程序员面试这个话题,我想,每个从事java开发的人都有一套自己的见解,特别是工作3年以上的。对于学校里将要毕业即将开始找工...
  • chwshuang
  • chwshuang
  • 2015年11月06日 18:11
  • 2782
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:18.c/c++程序员面试宝典-函数指针
举报原因:
原因补充:

(最多只允许输入30个字)