【C语言从入门到放弃 3】函数、枚举、指针、函数指针和回调函数详解

摘要:C语言是一种强大而灵活的编程语言,它提供了丰富的函数、枚举、指针、函数指针和回调函数等特性,使得程序员能够更好地进行程序设计和开发。本文将通过简单的示例代码介绍这些特性的用法和优势。

一、函数

函数是C语言中的基本构建块,它允许将一段代码封装为一个可重复使用的模块。函数具有输入参数和返回值,可以接收参数并执行特定的任务,然后返回结果。通过函数,我们可以将复杂的问题分解为更小的、可管理的部分。

示例代码:

#include <stdio.h>// 定义一个函数,计算两个整数的和
int add(int a, int b) {return a + b;
}int main() {int result = add(3, 5);printf("3 + 5 = %d\n", result);return 0;
}

上述代码中,我们定义了一个函数add,它接收两个整数参数a和b,并返回它们的和。在main函数中,我们调用add函数并打印结果。输出结果为"3 + 5 = 8"。

二、枚举

枚举是一种自定义的数据类型,用于定义一组具有相关性的常量。通过枚举,我们可以在程序中使用更具有可读性和可维护性的常量,而不是使用硬编码的数值。枚举常量可以通过名称来引用,从而增加了代码的可读性。

示例代码:

#include <stdio.h>// 定义一个枚举类型,表示星期几
enum Weekday {Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
};int main() {enum Weekday today = Wednesday;printf("Today is %d\n", today);return 0;
}

上述代码中,我们定义了一个枚举类型Weekday,表示星期几。在main函数中,我们声明一个变量today,并将其赋值为Wednesday,然后打印出today的值。输出结果为"Today is 2",表示今天是星期三。

三、指针

指针是C语言中的重要概念,它存储了一个变量的内存地址。通过指针,我们可以直接访问和修改内存中的数据,实现更高效的数据操作。指针还可以用于动态分配内存和传递复杂数据结构。

示例代码:

#include <stdio.h>int main() {int num = 10;int *ptr = &num;  // 声明一个指针变量,指向num的地址printf("The value of num is %d\n", num);printf("The value of num using pointer is %d\n", *ptr);return 0;
}

上述代码中,我们声明了一个整数变量num,并通过指针ptr将其地址赋值给ptr。然后,我们使用指针访问num的值,并打印出来。输出结果为"The value of num is 10"和"The value of num using pointer is 10"。

四、函数指针

函数指针是指向函数的指针变量。通过函数指针,我们可以在运行时动态地选择要调用的函数,实现更灵活的程序设计。函数指针通常用于回调函数、动态库加载和函数式编程等场景。

示例代码:

#include <stdio.h>// 定义一个函数,打印一个整数
void printInt(int num) {printf("The number is %d\n", num);
}int main() {void (*ptr)(int);  // 声明一个函数指针变量ptr = printInt;  // 将函数的地址赋值给函数指针ptr(5);  // 通过函数指针调用函数return 0;
}

上述代码中,我们定义了一个函数printInt,它接收一个整数参数并打印出来。在main函数中,我们声明了一个函数指针变量ptr,并将printInt函数的地址赋值给ptr。然后,我们通过函数指针调用printInt函数并传递参数5。输出结果为"The number is 5"。

五、回调函数

回调函数是一种通过函数指针传递给其他函数的函数。通过回调函数,我们可以在函数执行过程中动态地指定要执行的代码,实现更灵活的程序控制。回调函数通常用于事件处理、异步编程和插件系统等场景。

示例代码:

#include <stdio.h>// 定义一个回调函数类型
typedef void (*Callback)(int);// 定义一个函数,接收一个回调函数作为参数
void process(Callback callback, int num) {printf("Processing...\n");callback(num);
}// 定义一个回调函数,打印一个整数的平方
void printSquare(int num) {printf("The square of %d is %d\n", num, num * num);
}int main() {process(printSquare, 4);return 0;
}

上述代码中,我们定义了一个回调函数类型Callback,并将其作为参数传递给process函数。在main函数中,我们调用process函数并传递printSquare函数作为回调函数,同时传递参数4。输出结果为"Processing..."和"The square of 4 is 16"。

总结:

C语言的函数、枚举、指针、函数指针和回调函数是实现高效、灵活和可扩展程序设计的重要工具。

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

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

相关文章

分享98个节日庆典PPT,总有一款适合您

分享98个节日庆典PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/1gNj_uRLz9a5uTG97ezma7Q?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付…

生产环境中oracle dba权限检查和回收相关命令汇总

一、oracle dba权限检查和回收的作用和意义 在Oracle数据库生产环境中&#xff0c;回收oracle dba权限的作用和意义重大&#xff0c;具体表现在以下三方面&#xff1a; 安全性&#xff1a;回收赋权检查和回收可以确保数据库中的权限控制得到有效管理。通过检查和回收权限&…

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】机器视觉

目录 前言 几个高频面试题目 像素和像元如何选择?

RK356X Android13.0 HDMI和喇叭同时出声音

补丁适用范围:RK356X Android13.0 Android默认音频输出逻辑,不接HDMI默认喇叭音频输出,若检测到HDMI接入后,关闭喇叭输出,开启HDMI音频输出,但是BOX产品的使用场景需要插入HDMI后,喇叭仍然输出,可加入此补丁 $ vim frameworks/base/services/core/java/com/android/s…

Django初窥门径-自定义用户模型

前言 自定义用户模型在Django应用中是一个重要的话题&#xff0c;它涉及到如何根据您的项目需求以及特定的用户身份验证和授权需求来调整用户模型。在以下前言中&#xff0c;我将讲述为什么自定义用户模型是如此重要以及其潜在的优势&#xff1a; 随着Web应用的不断发展&…

科智牧RFID|生猪养殖信息化管理RFID方案提供

以RFID技术为手段&#xff0c;以网络技术和数据库技术为支撑&#xff0c;构建生猪的养殖信息化管理方案&#xff0c;为养殖企业建立完善的生猪档案系统&#xff0c;实现养殖企业信息化管理&#xff0c;做到生猪养殖环节从饲料、养殖、防疫、治疗的信息记录与管理&#xff0c;也…

[计算机网络]认识“协议”

认识“协议” 文章目录 认识“协议”序列化和反序列化网络计算器引入Sock类设计协议编写服务端类启动服务端编写客户端类启动客户端程序测试 序列化和反序列化 在网络体系结构中&#xff0c;应用层的应用程序会产生数据&#xff0c;这个数据往往不是简单的一段字符串数据&…

社科赛斯预测考研趋势,竞争白热化后,稳上岸还是冲名校?

对于考研党来说&#xff0c;择校应该是备考过程中最纠结的一件事情了。这几年来影响院校选择的情况愈加复杂多变&#xff0c;单一志愿的限制下&#xff0c;如何预测报名走向&#xff0c;如何选择院校才能够成功上岸&#xff0c;不像是一个人的战斗&#xff0c;更像是一场几百万…

利用h5py加速数据集读取

直接使用&#xff1a; def store_in_h5(images, output_filename):with h5py.File(output_filename, w) as hf:data_group hf.create_group(data)label_group hf.create_group(label)for i, (data_patches, label_patches) in enumerate(images):for j, (data, label) in en…

按键精灵中的函数使用

1. 命令名称&#xff1a;Function 函数 &#xff1b; 2. 命令功能&#xff1a;定义一个函数 &#xff1b; 3. 语法格式&#xff1a; Function 函数名([自定义参数1, 自定义参数2, ...]) 执行语句 [函数名返回值]End Function 4. 参数说明&#xff1a; 函…

什么是4A架构

4A架构通常在软件工程或系统架构领域中提到&#xff0c;特别是与企业级应用和系统设计相关。但是&#xff0c;“4A”这个术语可能有不同的解释&#xff0c;具体取决于上下文。以下是几种可能的含义&#xff1a; 身份认证&#xff08;Authentication&#xff09;、授权&#xff…

飞书开发学习笔记(二)-云文档简单开发练习

飞书开发学习笔记(二)-云文档简单开发练习 一.云文档飞书开发环境API 首先还是进入开放平台 飞书开放平台&#xff1a;https://open.feishu.cn/app?langzh-CN 云文档相关API都在“云文档”目录中&#xff0c;之下又有"云空间",“文档”&#xff0c;“电子表格”&a…

CSS的概念和基本用法

CSS的作用&#xff1a; 页面美化和布局控制。 1.概念&#xff1a; Cascading Style Sheets 层叠样式表。 层叠&#xff1a;多个样式可以作用在同一个html的元素上&#xff0c;同时生效。 2.好处&#xff1a; (1).功能强大 (2).将内容展示和样式控制分离 * 降低耦合度&#xf…

Java选择与循环

1.选择 前言&#xff1a;什么是选择呢&#xff1f;在我们的人生中处处面临着选择&#xff0c;比如说在学校你可以选择玩&#xff0c;摆烂&#xff0c;当然也可以选择努力写代码&#xff0c;刷题。什么样的选择就会面临什么样的结果。 其实程序和人生一样&#xff1a;顺序中夹杂…

简单代理模式

代理模式 代理模式(Proxy)&#xff0c;为其他对象提供一种代理以控制对这个对象的访问。 结构图如下&#xff1a; ISubject接口&#xff0c;定义了RealSubject和Proxy的共用接口方法&#xff0c;这样就可以在任何使用RealSubject的地方使用Proxy代理。 ISubject接口 public…

sed续与awk(粗糙版)

s:sed d 替换功能&#xff0c;改 s:替换字符串 格式是&#xff1a;sed -n s/需要替换的原内容/替换后的内容/(ps&#xff1a;数字是替换每行中的第几个&#xff0c;g代表是全内容替换)p 替换的文件地址 例如&#xff1a; c:整行替换 y:字符替换&#xff0c;替换前后的字符串…

【洛谷 P5143】攀爬者 题解(结构体排序)

攀爬者 题目背景 HKE 考完 GDOI 之后跟他的神犇小伙伴们一起去爬山。 题目描述 他在地形图上标记了 N N N 个点&#xff0c;每个点 P i P_i Pi​ 都有一个坐标 ( x i , y i , z i ) (x_i,y_i,z_i) (xi​,yi​,zi​)。所有点对中&#xff0c;高度值 z z z 不会相等。HKE…

idea使用lombok编译问题

idea编译报错问题如下&#xff1a; java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled.Your processor is: com.sun.proxy.$Proxy26Lombok supports: OpenJDK javac, ECJ解决方案&#xff1a;在idea配置中File->Setti…

挑战100天 AI In LeetCode Day02(1)

挑战100天 AI In LeetCode Day02&#xff08;1&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-32.1 题目2.2 题解 三、面试经典 150 题-33.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&#xff0c;面向程序…

IOS自带的OCR识别功能

一、识别身份证 interface IDCardScanViewController () <AVCaptureMetadataOutputObjectsDelegate> property (nonatomic, strong) AVCaptureSession *captureSession; end implementation IDCardScanViewController - (void)viewDidLoad { [super viewDidLoad…