萌导航

8.8C语言指针型函数和函数指针变量

作者: 叶子 来源: 怪哈哈网 日期: 2015-09-29 10:15:09 人气: -

指针型函数

前面我们介绍过,所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。定义指针型函数的一般形式为:

数据类型 *函数名(形参列表){
    //函数体
}

函数名之前加了*号表明这是一个指针型函数,它的返回值是一个指针。如:

  1. #include <stdio.h>

  2. // 返回两个字符串中较长的一个
  3. char *func(char *str1, char *str2){
  4. if(strlen(str1) >= strlen(str2)){
  5. return str1;
  6. }else{
  7. return str2;
  8. }
  9. }

  10. int main(){
  11. char *s1 = "C Language";
  12. char *s2 = "C is very great!";
  13. char *longstr = func(s1, s2);
  14. printf("Long string: %s\n", longstr);

  15. return 0;
  16. }

运行结果:
Long string: C is very great!

func 是一个指针型函数,它返回的指针指向一个字符串。

函数指针变量(选读)

在C语言中,一个函数总是占用一段连续的内存区域,函数名就是该函数所占内存区域的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数,然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为函数指针变量

函数指针变量定义的一般形式为:

数据类型 (*指针变量名)();

数据类型表示被指函数的返回值的类型,(*指针变量名)表示 * 后面的变量是指针变量,最后的空括号表示指针变量所指的是一个函数。例如:
int (*pf)();
表示 pf 是一个指向函数入口的指针变量,该函数的返回值是整型。

【示例】用指针形式实现对函数的调用。

  1. #include <stdio.h>

  2. // 返回两个值中较大的值
  3. int max(int a, int b){
  4. if(a>b) return a;
  5. else return b;
  6. }

  7. int main(){
  8. int(*pmax)();
  9. int x, y, maxval;
  10. pmax = max;
  11. printf("Input two numbers:");
  12. scanf("%d %d", &x, &y);
  13. maxval = (*pmax)(x, y);
  14. printf("Max value: %d\n", maxval);

  15. return 0;
  16. }

运行结果:
Input two numbers:100 200
Max value: 200

从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:

  1. 先定义函数指针变量,第10行int(*pmax)();定义 pmax 为函数指针变量。
  2. 把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第12行pmax=max;
  3. 用函数指针变量形式调用函数,如程序第15行z=(*pmax)(x,y);
  4. 调用函数的一般形式为:(*指针变量名) (实参列表)


使用函数指针变量还应注意以下两点:

  • 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。
  • 函数调用中(*指针变量名)的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。


转载请注明文章来源(欢迎分享): http://www.guaihaha.com/c/5622.html

相关内容

HTML5游戏 HTML5游戏
关于怪哈哈
怪哈哈是一个集搞笑,美女,动漫,游戏,技术等为核心的综合性网站!
联系我们
商务洽谈、广告合作、友情链接、侵权举报,这些都可以联系我们哦!
关于我们 - 联系我们 - 广告服务 - 免责申明  
本站文字和图片均为严格审查筛选收藏,均收集整理于互联网,其著作权归原作者所有,如果有侵犯您权利的照片,请来信告知,我们将及时撤销相应文字和图片。
Copyright @2014-2020 怪哈哈网 All Rights Reserved。
【谢谢大家一直支持贵站!】