关闭

c语言中函数指针与指针函数的区别

标签: c语言指针面试
104人阅读 评论(0) 收藏 举报
分类:

今天面试被问到指针函数和函数指针的区别,然并卵,大学学完都还给老师了,今天回来重新看了一遍,整理出来,供大家参考!


1.指针函数:一个返回值是指针的函数。

例如:由于指针一般指的都是地址,地址为int型,所以int *fp(参数)即为一个指针函数。在main 函数中调用时步骤如下 :int *p=NULL; p=fp(参数);


2.函数指针:一个指向函数的指针。

例如:由于函数名即为指针,所以 void (*fp)( )即为一个函数指针,在main函数中的用法如下:


void   fft( );

 void (*fp)( );

main( )

{

     fp=fft;

    (*fp)( );//可以通过fp执行fft( )函数

}


3.指针的指针:一个指向指针的指针。

例如: char c='B' ; char *p=&c; char **fp=&p;

它的用处是允许被调用函数修改局部指针变量和处理指针数组。

void FindCredit(int **);  

main() 

{

  int vals[]={7,6,5,-4,3,2,1,0}; 

int *fp=vals; 

FindCredit(&fp); 

printf("%d\n",*fp);

 } 

void FindCredit(int ** fpp)

 { 

while(**fpp!=0)

{

  if(**fpp<0) break; 

else (*fpp)++;  //通过改变*fpp的值,找到数组中的负值。

}

}

语句(*fpp)++就是对形参指针指向的指针进行自增运算的。但是因为*运算符和++运算符都是单目运算符,按从右到左的原则,++的优先级高于*的,所以圆括号在这里是必须的,如果没有圆括号,那么++运算符将作用于二重指针fpp上。


4.指针数组的指针:一个指向指针数组的指针。

例如:指针数据的元素是指针,通过指针数组的指针,可以访问指针数组。一种常见用法是处理字符串

char *Names[]=  { 

"Bill",  "Sam", 

"Jim",  "Paul", 

"Charles",  0 

};  

main()  {

 char **nm=Names;

 while(*nm!=0)

 printf("%s\n",*nm++); 

}

 先用字符型指针数组Names的地址来初始化指针nm。每次printf()的调用都首先传递指针nm指向的字符型指针,然后nm进行自增运算使其指 向数组的下一个元素(还是指针)。注意完成上述认为的语法为*nm++,它首先取得指针指向的内容,然后使指针自增。


PS:注意文章中标红的部分,有人会有疑问为什么前者要用括号,而后者不用括号呢!

这是因为对于前者的指针fpp来说,它初始化的是指向数组首地址的指针,要想访问数组的下一个元素,是对fp指向的地址中的内容(它是一个指针)进行自增运算,即(*fpp)++;

后者的指针fpp,它初始化的是指针数组的首地址,要想访问数组的下一个元素,直接对fpp进行自增运算,不需要加圆括号






0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:390次
    • 积分:34
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档