百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

C语言进阶:函数指针的定义与使用(c语言函数指针的作用)

citgpt 2024-07-10 14:44 10 浏览 0 评论

函数指针

今天准备和大家讲解一下我们C语言编程的函数指针,为什么函数也需要指针呢?我是这样理解的函数指针方便我们对函数的调用,当我们需要把一个函数作为参数传给其他参数的时候就必须使用函数指针才能很好的完成。我希望今天能够很清楚很详细地和大家分享一下函数指针这一块的重点和难点。看完之后你会对函数指针的理解、定义、使用有一个比较全面的认识,废话不多说我们进入正题。

C语言进阶:函数指针的定义与使用(c语言函数指针的作用)

我们先来看下面的代码:

1 int * fun1 (int *ptr1, int *ptr2);

2 int * *fun2 (int *ptr1, int *ptr2);

3 int *(*fun3)(int *ptr1, int *ptr2);

在这里定义1、2、3个表达式,首先看到比较复杂的表达式不要慌,不要对它产生畏惧,我们先来一个一个分析。

第1个定义是什么意思?fun3是我们的函数名字没什么问题吧,括号里面是fun3的参数,类型都是int 行指针,和今天讲的没什么关系,括号都可以不用看,最后我们看最前面的int * 是什么意思?那不就是函数的返回值嘛,返回的是一个整型的指针。

第2个定义我们看看和第1个定义有什么区别?是不是比第1个定义多了一个 * 号那其他和第一个是一样的呀,只是返回值是一个指针的指针,是一个二级指针。

第3个定义就是我们今天的重点内容,打起精神了,精彩来啦!如果我们把第3个表达式的(*fun3)看作一个整体的话你发现他和第一表达式 int * fun1 (int *ptr1, int *ptr2);没有什么区别了?那它就是返回值为整型指针,参数为两个整型的指针对吧?好我们现在回过头来分析(*fun3)是什么东西,我们先看一个比较好理解的:*ptr 看到没有?是不是很类似,我们都知道ptr是一个指针对吧,那我们的 *fun3 和它一样也是一样指针,然后再看: int *ptr ; ptr是不是变成了一个整型指针?为什么是整型呢?原来他前面是int类型的对吧都理解那就对了我们来完整地分析第3个定义:

int *(*fun3)(int *ptr1, int *ptr2);

首先我们知道这是一个函数:

函数的返回值:int * 一个整型指针;

函数参数:int *ptr1,int*ptr2 两个整型指针;

(*fun3)是一指针;

总结:此时fun3不是一个普通的函数名了而是一个指针变量,是一个指向函数的指针;

函数指针的用法

   #include<string.h>
   #include<stdlib.h>
   int * fun(int a ,int b)
{
     if(a>b)
       printf("a比b大!!\n");
     else
       printf("a比b小!!\n");
  }
  
  void  max(int * (fun1)(int a,int b),int c,int d)
{
  
  printf("max函数里面调用的\n");
  fun1(c,d);
  
  }
  
  int main()
{
  int a=10;
  int b=20;
  
  int *(*fun1)(int a, int b);
  fun1=&fun;
  
  printf("fun函数正常调用的\n");
  fun(a,b);
  printf("函数指针调用的\n");
  (*fun1)(a,b);
  max(fun1,a,b);
 
 return 0;
  }  

代码和结果分析:

我们可以看一下三种fun函数的调用都成功了第一种的话是普通的调用给她传参数就可以了,第二个是函数指针的调用把fun的地址赋值给了函数指针fun1,然后调用也没问题,重点是第三个用法,我们把函数fun当做一个参数传到了函数max里面去了,也可以实现对函数fun的调用,这意义太大了,这也是函数指针的魅力所在。为什么呢?你想想如果我们有很多类似的函数十几个二十几个的时候我们怎么管理和使用,这时候我们可以用函数指针去管理和调用他们,把他们都装进一个函数指针数组,当然如果你够强你可以在定义一样指针指向这个数组。

在这里提一下我们的函数指针数组和函数指针数组指针:

函数指针数组:

int * (*fun[5])(int *p,int *p2)

函数指针数组指针

int * (*(fun)[5])(int *p,int *p2);

后期准写两篇专门来介绍这两种,想在评论区听一下各位对这两个知识点的看法总结一下理清楚思路再写,评论区交给大佬了!

感觉写的有些废头发,不知道你们看完知道什么是函数指针没有?

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: