简要说明C语言中指针函数与函数指针的区别

 更新时间:2016年04月25日 16:28:00   作者:hzy3774  
这篇文章主要介绍了C语言中指针函数与函数指针的区别,指针函数和函数指针是C语言入门学习中的基础知识,需要的朋友可以参考下

指针函数一般是指返回指针的函数;

#include <stdio.h> 
 
int* fun(int *a) 
{ 
  return a; 
} 
 
int main(int argc, char **argv) 
{ 
  int a = 3; 
  printf("%d", *(fun(&a))); 
  return 0; 
} 

 
函数指针是表示指向函数开始地址的指针:
首先要了解函数的调用过程:

#include <stdio.h> 
 
int fun(int i) 
{ 
  return i + 1; 
} 
 
int main(int argc, char **argv) 
{ 
  int r; 
  //r = fun(5); 
  r = (*fun)(5);   //调用方式 
  printf("%d\n", r); 
  return 0; 
} 

函数可以用r = (*fun)(5);来调用,说明函数名其实是一个指针,
通过(*fun)来寻址。所以我们就可以定义一个指针

#include <stdio.h> 
 
int fun(int i) 
{ 
  return i + 1; 
} 
 
int main(int argc, char **argv) 
{ 
  int r; 
  int (*funP)(int);  //声明指针 
  //funP = fun;    //给指针赋值 
  funP = &fun; 
  r = funP(5); 
  printf("%d\n", r); 
  return 0; 
} 

 
所以,给函数指针赋值也有两种方式;
同样,通过函数指针调用函数的方式也有两种:

#include <stdio.h> 
 
int fun(int i) 
{ 
  return i + 1; 
} 
 
int main(int argc, char **argv) 
{ 
  int r; 
  int (*funP)(int);  //声明指针 
  funP = fun;   //给指针赋值 
  //r = funP(5); 
  r = (*funP)(5);   //调用 
  printf("%d\n", r); 
  return 0; 
} 

也就是说,除了声明的地方,fun()与(*fun)()的作用是一样的。
这样,也就让C语言容易实现类似于回调函数的结构:

#include <stdio.h> 
 
int funA(int i) 
{ 
  return i + 1; 
} 
 
int funB(int i) 
{ 
  return i - 1; 
} 
 
void fun(int (*funP)(int), int i) 
{ 
  printf("%d\n", funP(i)); 
} 
 
int main(int argc, char **argv) 
{ 
  int (*funP)(int);  //声明指针 
  funP = funA;    //给指针赋值 
  //funP = funB;   //给指针赋值 
 
  fun(funP, 5);    //调用 
  return 0; 
} 

 在fun()函数里,它做的只是在某个时候调用一个funP指针指向的函数,至于是哪个函数,在fun函数的定义处还无从得知;直到将funA赋给函数指针funP,funP具体要做什么功能,才得以确定。
也就是说,main函数决定fun函数需要帮它实现什么函数代码,但是fun何时调用以及是否调用main给他的函数,那是由fun()来决定。

相关文章

  • C++11 移动构造函数的使用

    C++11 移动构造函数的使用

    本文主要介绍了C++11 移动构造函数的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 嵌入式C程序优质编写全面教程规范

    嵌入式C程序优质编写全面教程规范

    这是一年前我为公司内部写的一个文档,旨在向年轻的嵌入式软件工程师们介绍如何在裸机环境下编写优质嵌入式C程序。感觉是有一定的参考价值,所以拿出来分享,抛砖引玉
    2022-04-04
  • Cmake中强大的输出函数message示例解析

    Cmake中强大的输出函数message示例解析

    这篇文章主要介绍了Cmake中强大的输出函数message解析,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • C语言实现走迷宫

    C语言实现走迷宫

    这篇文章主要为大家详细介绍了C语言实现走迷宫,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C++实现LeetCode(148.链表排序)

    C++实现LeetCode(148.链表排序)

    这篇文章主要介绍了C++实现LeetCode(148.链表排序),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言代码中调用C++代码的方法示例

    C语言代码中调用C++代码的方法示例

    这篇文章主要介绍了C语言代码中调用C++代码的方法示例,文中也介绍了C++代码调用C代码的方法,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • C语言平衡二叉树详解

    C语言平衡二叉树详解

    这篇文章主要介绍了C语言平衡二叉树的相关资料,需要的朋友可以参考下,小编觉得这篇文章写的还不错,希望能够给你带来帮助
    2021-11-11
  • VC++6.0中创建C++项目的实现步骤

    VC++6.0中创建C++项目的实现步骤

    本文主要介绍了VC++6.0中创建C++项目的实现步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • C++ 处理中文符号实例详解

    C++ 处理中文符号实例详解

    这篇文章主要介绍了C++ 处理中文符号实例详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • C语言数据结构 双向链表的建立与基本操作

    C语言数据结构 双向链表的建立与基本操作

    这篇文章主要介绍了C语言数据结构 双向链表的建立与基本操作的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论