【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数

news2024/12/25 0:35:58

【C语言】函数指针与指针函数


文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、指针数组
  • 二、数组指针
  • 三、函数指针
  • 四、指针函数
  • 五、函数指针数组
  • 六、回调函数
  • 七、参考资料
  • 总结

前言

使用工具:
1.DEVC++


提示:以下是本篇文章正文内容,下面案例可供参考

一、指针数组

优先级关系:( ) > [ ] > *。
char *p[4]是个数组,那就要干数组的活。指针数组的意思就是,这个数组里面的元素都是指针。指针的类型是char ,指向的内容也是char 型。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
/*++++++++++++++++++++++++++++++++++++++*/ 
/*           声明一个指针数组            */
/*++++++++++++++++++++++++++++++++++++++*/
	char *point_array[4];
	char array[5] = {'1', '2', '3', '4', '\0'};  // 使用字符初始化
	point_array[0] = &array[0];  // 示例:只初始化第一个指针
	point_array[1] = &array[1];
	point_array[2] = &array[2];
	point_array[3] = &array[3];
	printf("*point_array[0] = %d, *point_array[1] = %d, *point_array[2]= %d, *point_array[3] = %d\n",\
		*point_array[0], *point_array[1], *point_array[2], *point_array[3]);
	printf("array[0] = %d, array[1] = %d, array[2] = %d, array[3]= %d\n",\
		array[0], array[1], array[2], array[3]);
	system("pause");
	return 0;
}



在这里插入图片描述

二、数组指针

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
/*++++++++++++++++++++++++++++++++++++++*/ 
/*           声明一个数组指针            */
/*++++++++++++++++++++++++++++++++++++++*/
	int (*array_point)[5];
	int array[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
	array_point = array;
	printf("*array_point[0]= %d, *array_point[1]= %d, *array_point[2] = %d, *array_point[3]= %d\n",\
		*array_point[0], *array_point[1], *array_point[2], *array_point[3]);
	printf("*array[0] = %d, *array[1] = %d, *array[2] = %d, *array[3] = %d\n",\
		*array[0], *array[1], *array[2],*array[3]);
	system("pause");
	return 0;
}


在这里插入图片描述

三、函数指针

#include <stdio.h>

// 相加函数
int add(int x, int y)
{
    return x + y;
}

// 相减函数
int subtract(int x, int y)
{
    return x - y;
}

/*++++++++++++++++++++++++++++++++++++++*/ 
/*           声明一个函数指针            */
/*    1.指针指向的函数参数类型要相同      */
/*    2. 是一个指针,无需返回值           */
/*    3.可以不用声明变量,因为无需传参     */
/*++++++++++++++++++++++++++++++++++++++*/
int (*fun)(int , int ); 

int main()
{
    fun = add;          //函数指针等价于add函数
    printf("相加:%d\n", (fun)(1,2));
    fun = subtract;     函数指针等价于subtract函数
    printf("相减:%d\n", (*fun)(1, 2));
}

输出结果: 相加:3
          相减:-1

四、指针函数

#include <stdio.h>

// 相加函数
int add(int x, int y)
{
    return x + y;
}

// 相减函数
int subtract(int x, int y)
{
    return x - y;
}

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*                     声明一个指针函数                       */
/*        1.fun没有被括起来,fun后面跟着括号可以进行传参         */
/*        如: int (*fun(int x))(int,int )                    */
/*        所以 *fun()为指针函数                               */
/*        2.int (int a,int b) 是指针返回的函数原型             */
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
int (*fun())(int, int)
{
    return add;
}

int (*fun_chose(int chose))(int, int)
{
    if (1 == chose)
    {
        return subtract;
    }
}

int main()
{
    int (*operation)(int, int);
    operation = fun();
    printf("相加:%d\n", operation(1, 2));
    operation = fun_chose(1);
    printf("相减:%d\n", operation(1, 2));
}

输出结果: 相加:3
          相减:-1

五、函数指针数组

#include<stdio.h>
#include<stdlib.h>
void fun1(const char *str)
{
	printf("fun1:%s", str);
}
void fun2(const char *str)
{
	printf("fun2:%s", str);
}
void fun3(const char *str)
{
	printf("fun3:%s", str);
}
int main()
{
	int i = 0;
	/*void(*pfun1)(const char *) = fun1;
	void(*pfun2)(const char *) = fun2;
	void(*pfun3)(const char *) = fun3;*/
	void(*function_ponit_array[3])(const char *) = { fun1, fun2, fun3 };
	for (i = 0; i < 3; i++)
	{
		function_ponit_array[i]("hello world\n");
	}
	system("pause\n");
	return 0;
}

在这里插入图片描述

六、回调函数

#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
// 定义回调函数类型
typedef void (*CallbackType)(int);
// 函数接受回调函数作为参数
void performOperation(int data, CallbackType callback) {
    // 执行操作
    printf("Performing operation with data: %d\n", data);
    // 调用回调函数
    callback(data);
}
// 实现一个回调函数
void callbackFunction(int result) {
    printf("Callback function called with result: %d\n", result);
}
int main(int argc, char *argv[]) {
	performOperation(42, callbackFunction);
	system("pause") ;
	return 0;
}

在这里插入图片描述

七、参考资料

【C语言】《回调函数》详细解析
c语言:数组指针,指针数组,函数指针,函数指针数组,指向函数指针数组的指针C语言-数组指针与指针数组
【C语言】 “函数指针”和“指针函数” 用法和详解(太细了!!!)菜鸟级教程

总结

本文仅仅简单介绍了【C语言】函数指针与指针函数,评论区欢迎讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2264978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为IPD流程6大阶段370个流程活动详解_第二阶段:计划阶段 — 86个活动

华为IPD流程涵盖了产品从概念到上市的完整过程,各阶段活动明确且相互衔接。在概念启动阶段,产品经理和项目经理分析可行性,PAC评审后成立PDT。概念阶段则包括产品描述、市场定位、投资期望等内容的确定,同时组建PDT核心组并准备项目环境。团队培训涵盖团队建设、流程、业务…

Adversarial Machine Learning(对抗机器学习)

之前把机器学习&#xff08;Machine Learning&#xff09;的安全问题简单记录了一下&#xff0c;这里有深入研究了一些具体的概念&#xff0c;这里记录一下方便以后查阅。 Adversarial Machine Learning&#xff08;对抗机器学习&#xff09; Adversarial Examples 相关内容Eva…

UE5 猎户座漂浮小岛 12 技能 瞬移 重力控制

1. 瞬移 1.1. 显示鼠标光标 “事件开始运行”添加显示鼠标逻辑 1.2. 释放技能蓝图 设置技能键 编写蓝图 1.3. 瞬移最大距离 2. 重力控制 2.1. 添加输入与动画 映射 重定向得到动画 新增状态FIRE_GracityControl 设置动画姿势 新增变量 切换动画 2.2. 技能蓝图&#xff08;…

SpiderFlow平台v0.5.0流程的执行过程

流程执行过程&#xff1a; 1. 流程启动 流程的执行通常从一个 开始节点 开始&#xff0c;该节点是整个爬虫任务的起点。开始节点没有实际的功能作用&#xff0c;主要作用是标记流程的起始。 执行顺序&#xff1a;在执行过程中&#xff0c;系统按照流程中的连接线顺序依次执行…

JVM系列(十二) -常用调优命令汇总

最近对 JVM 技术知识进行了重新整理&#xff0c;再次献上 JVM系列文章合集索引&#xff0c;感兴趣的小伙伴可以直接点击如下地址快速阅读。 JVM系列(一) -什么是虚拟机JVM系列(二) -类的加载过程JVM系列(三) -内存布局详解JVM系列(四) -对象的创建过程JVM系列(五) -对象的内存分…

【Java基础面试题033】Java泛型的作用是什么?

Java的基础语法可以看尚硅谷的这个PDF&#xff1a;尚硅谷JavaSE基础/《Java从入门到精通(JDK17版)》_尚硅谷电子书.pdf Autism_Btkrsr/Blog_md_to_pdf - 码云 - 开源中国 (gitee.com) 回答重点 Java泛型的作用是通过在编译时检查类型安全&#xff0c;允许程序员编写更通用和…

如何永久解决Apache Struts文件上传漏洞

Apache Struts又双叒叕爆文件上传漏洞了。 自Apache Struts框架发布以来&#xff0c;就存在多个版本的漏洞&#xff0c;其中一些漏洞涉及到文件上传功能。这些漏洞可能允许攻击者通过构造特定的请求来绕过安全限制&#xff0c;从而上传恶意文件。虽然每次官方都发布补丁进行修…

重生之我在异世界学编程之C语言:深入动态内存管理收尾 + 柔性数组篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文常见的动态内存管理错误&#xf…

重温设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…

python使用pip进行库的下载

前言 现如今有太多的python编译软件&#xff0c;其库的下载也是五花八门&#xff0c;但在作者看来&#xff0c;无论是哪种方法都是万变不离其宗&#xff0c;即pip下载。 pip是python的包管理工具&#xff0c;无论你是用的什么python软件&#xff0c;都可以用pip进行库的下载。 …

Apache Solr RCE(CVE-2017-12629)--vulhub

Apache Solr 远程命令执行漏洞&#xff08;CVE-2017-12629&#xff09; Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…

apisix转发websocket

1、说明 apisix网关对接websocket&#xff0c;参数以及使用可以看官方文档 WebSocket Authentication | Apache APISIX -- Cloud-Native API Gateway 注意事项&#xff1a; &#xff08;1&#xff09;官方文档是websocket要加认证&#xff0c;但自测发现可以不加认证插件 …

【unity】【游戏开发】Unity项目一运行就蓝屏报Watch Dog Timeout

【背景】 由于是蓝屏所以没法截屏&#xff0c;总之今天遇到了一开Unity&#xff0c;过一阵就蓝屏的情况&#xff0c;报Watch Dog Timeout。 【分析】 通过任务管理器查看&#xff0c;发现Unity占用率100%&#xff0c;再观察Unity内部&#xff0c;每次右下角出现一个Global I…

【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用(2024/12/12补充)

最终效果 文章目录 最终效果更好的方式&#xff08;2024/12/12补充&#xff09;前言为什么使用CharacterControllerSimpleMove和Move如何选择&#xff1f;1. SimpleMove2. Move 配置CharacterController参数控制相机移动跳跃方式一方式二 下蹲处理下坡抖动问题实现奔跑和不同移…

sentinel学习笔记6-限流降级(上)

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;写的好值得推荐&#xff0c;我整理的有所删减&#xff0c;推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应…

使用 UniApp 在微信小程序中实现 SSE 流式响应

概述 服务端发送事件&#xff08;Server-Sent Events, SSE&#xff09;是一种允许服务器向客户端推送实时更新的技术。SSE 提供了一种单向的通信通道&#xff0c;服务器可以持续地向客户端发送数据&#xff0c;而不需要客户端频繁发起请求。这对于需要实时更新的应用场景非常有…

监控易在汽车制造行业信息化运维中的应用案例

引言 随着汽车制造行业的数字化转型不断深入&#xff0c;信息化类IT软硬件设备的运行状态监控、故障告警、报表报告以及网络运行状态监控等成为了企业运维管理的关键环节。监控易作为一款全面、高效的信息化运维管理工具&#xff0c;在汽车制造行业中发挥着重要作用。本文将结合…

Unity DOTS中的share component

Unity DOTS中的share component 内存管理创建流程修改流程销毁流程Reference share component是DOTS中一类比较特殊的component&#xff0c;顾名思义&#xff0c;它是全局共享的component&#xff0c;所有具有相同component值的entity&#xff0c;共享一个component&#xff0c…

外连接转AntiJoin的应用场景与限制条件 | OceanBase SQL 查询改写系列

在《SQL 改写系列&#xff1a;外连接转内连接的常见场景与错误》一文中&#xff0c;我们了解到谓词条件可以过滤掉连接结果中的 null 情形的&#xff0c;将外连接转化为内连接的做法是可行的&#xff0c;正如图1中路径(a)所示。此时&#xff0c;敏锐的你或许会进一步思考&#…

Facebook的去中心化探索:社交平台的新型发展趋势

随着数字化进程的加速&#xff0c;社交平台的架构正在经历一场深刻的变革。从最初的集中的社交网络到如今去中心化的构想&#xff0c;社交平台正在朝着更加透明、开放和用户主导的方向发展。作为全球最大的社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;也在…