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

C语言编程:函数指针数组和函数指针数组指针的详解

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


点击蓝字 关注我们

C语言编程:函数指针数组和函数指针数组指针的详解

函数指针数组和函数指针数组指针

我们来看看今天的标题,你有没有觉得晕乎乎的,之前小企鹅发过一篇关于函数指针的用法,但是有粉丝反应没讲完全,所以今天答应给粉丝更新的一篇关于函数指针的深入探讨文章。

函数指针数组

我们看最后数组两个字,我们学C语言再也熟悉不过了吧,就是同一个类型的数据组成的数据集合,然后我们在往前看,它是“指针”什么意思,就是这个数组里面装的数据集合都是是指针,那我们都知道C语言指针也是分类型的,有整型指针,字符型指针,浮点型指针就,结构体指针等等,但是我们看最开始的“函数”,那说明我们这个数组里面的指针类型是函数。

我们举个例子看一下啊;

#include <stdio.h>
#include<string.h>
char * fun1(char *p)
{
printf("%s\n",p);
return 0;
}
char * fun2(char *p)
{
printf("%s\n",p);
return 0;
}
char * fun3(char *p)
{
printf("%s\n",p);
return 0;
}
int main()
{
char * (*pfun[3])(char *p);//我们定义一个函数指针指针数组;

//给我们的数组赋值
pfun[0]=fun1;//把函数fun1赋值给数组第一个元素,直接使用函数名;
pfun[1]=&fun2;//我们也可以在函数名前面加&把fun2地址付给第二个元素;
pfun[2]=&fun3;//给数组第三个元素赋值为fun3;

//使用
pfun[0]("函数fun1");
pfun[1]("函数fun2");
pfun[2]("函数fun3");
return 0;
}

结果

结果和我们直接使用fun1、fun2、fun3效果是一样的。

在这里我觉得可以在讲一个知识点,我们看代码中给第一个元素赋值是直接使用函数名,而后面两个用的都是&修饰的函数呢?他们有什么区别,我们来看一下下面的这个代码,我们在刚刚的代码打印出fun1和&fun1的值看一下;

printf("fun1=%u\n",fun1);

printf("&fun1=%u\n",&fun1);

结果如下图:

结果分析

我们可以看到其实打印出来的值是一样,所有我们其实可以认为函数名教师函数的地址。

我们的函数指针数组就讲到这里了,包括对函数指针的定义,使用都给大家讲解了。

函数指针数组指针

我先解释一下这个名字到底是什么吧,首先“函数指针数组”和我们刚刚在上面分析的一样,就是一个数组,数组里面的元素是函数指针,那我们在看最后两个字“指针”这说明说明,说明他是一个指针呀,比如我们说“XXX数组”,那它就是数组,这里我们看成“XXX指针”那它就是一个指针,既然他是一个指针那它是谁的指针?他是一个数组的指针,它指向一个数组,数组里面都是函数类型的指针。

char * (*(*ptrfun)[3])(char *p);//定义一个函数指针数组指针;

ptrfun=&pfun;//把函数指针数组的地址赋值给指针ptrfun;

pfun[0]=fun1;//把函数fun1赋值给数组第一个元素,直接使用函数名;

pfun[1]=&fun2;//我们也可以在函数名前面加&把地址付给第二个元素;

pfun[2]=&fun3;//给数组第三个元素赋值;


结果分析

我们可以发现函数指针数组指针对函数的调用结果也是和直接调用函数、调用函数数组元素一样的都可以对我们的函数进行调用。

现在你对函数指针数组和函数指针数组指针有更好地理解了么?我们在看下面这两个表达式:

int * (*fun[3])(char *p);

int* (*(*fun)[3])(char *p);

你现在可以解释这两个表达式个表示的意思了么?

相关推荐

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详解

取消回复欢迎 发表评论: