逍遥自在学C语言 | 指针函数与函数指针
前言
在C语言中,指针函数和函数指针是强大且常用的工具。它们允许我们以更灵活的方式处理函数和数据,进而扩展程序的功能。
本文将介绍指针函数和函数指针的概念,并讲解一些常见的应用示例。
一、人物简介
- 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。

- 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。

二、指针函数
指针函数是返回指针的函数,它的声明和定义与普通函数类似,但返回类型是一个指针类型。
指针函数可以用于返回数组、字符串或动态分配的内存等。
示例代码
#include <stdio.h>
int* getArray() {
static int arr[] = {1, 2, 3, 4, 5};
return arr;
}
int main() {
int* ptr = getArray();
printf("Array elements: ");
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]);
}
return 0;
}
在上面的示例中,
getArray()函数返回一个指向静态整数数组的指针在
main()函数中,我们通过指针访问并打印数组的元素输出结果
Array elements: 1 2 3 4 5
三、函数指针
函数指针是指向函数的指针变量。
通过函数指针,我们可以将函数作为参数传递给其他函数、在运行时动态选择要调用的函数等。
示例代码
#include <stdio.h>
/* 加法运算 */
int add(int a, int b) {
return a + b;
}
/* 减法运算 */
int subtract(int a, int b) {
return a - b;
}
void calculate(int (*operation)(int, int), int a, int b) {
int result = operation(a, b);
printf("Result: %d\n", result);
}
int main() {
int x = 10, y = 5;
calculate(add, x, y);
calculate(subtract, x, y);
return 0;
}
在上面的示例中,
calculate()函数接受一个函数指针参数operation,该参数指向一个具有两个整数参数和整数返回值的函数。在
main()函数中,我们使用calculate()函数来执行加法和减法运算。运行结果
Result: 15
Result: 5
四、指针函数的应用
指针函数在以下情况下特别有用:
动态分配内存:指针函数可以返回动态分配的内存,允许在运行时灵活地分配和释放内存。
返回数组或字符串:通过指针函数,可以方便地返回数组或字符串,而无需将它们作为函数参数传递或使用全局变量。
示例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* createString() {
char* str = (char*)malloc(sizeof(char) * 10);
strcpy(str, "Hello");
return str;
}
int main() {
char* ptr = createString();
printf("String: %s\n", ptr);
free(ptr);
return 0;
}
在上面的示例中,
createString()函数动态分配了一个大小为10的字符数组,并将字符串"Hello"复制到该数组中。然后,它返回该数组的指针。在
main()函数中,我们打印并释放该字符串。
String: Hello
五、函数指针的应用
函数指针具有以下应用场景:
回调函数:函数指针可用于实现回调机制,其中一个函数作为参数传递给另一个函数,并在需要时被调用。
运行时函数选择:函数指针允许根据运行时的条件选择要调用的函数,从而实现动态的程序行为。
示例代码
#include <stdio.h>
void greet_english() {
printf("Hello!\n");
}
void greet_spanish() {
printf("Hola!\n");
}
void greet_french() {
printf("Bonjour!\n");
}
int main() {
int choice;
// 声明函数指针,并初始化为NULL
void (*greet)() = NULL;
printf("请选择要使用的语言:\n");
printf("1. 英语\n");
printf("2. 西班牙语\n");
printf("3. 法语\n");
printf("\n请输入对应的数字:");
scanf("%d", &choice);
printf("\n");
// 根据用户的选择设置函数指针
if (choice == 1) {
greet = greet_english;
} else if (choice == 2) {
greet = greet_spanish;
} else if (choice == 3) {
greet = greet_french;
} else {
printf("无效的选择!\n");
return 0;
}
// 如果函数指针不为NULL,则调用相应的函数
if (greet != NULL) {
greet();
}
return 0;
}
- 在这个例子中,我们定义了三个不同的打招呼函数:
greet_english、greet_spanish和greet_french。 - 在
main函数中,我们声明了一个函数指针greet,并将其初始化为NULL。 - 用户可以选择要使用的语言,然后根据选择将函数指针
greet设置为相应的函数地址。 - 最后,如果函数指针不为
NULL,则调用相应的函数。 - 运行结果
请选择要使用的语言:
1. 英语
2. 西班牙语
3. 法语
请输入对应的数字:3
Bonjour!
小结
通过这篇文章,我们学会了
1、指针函数的概念
2、函数指针的概念
3、指针函数的应用
4、函数指针的应用
欢迎各位 点赞 收藏 评论,如有错误请留言指正,非常感谢!
逍遥自在学C语言 | 指针函数与函数指针的更多相关文章
- 逍遥自在学C语言 | 第一个C语言程序 九层之台起于垒土
一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.C语言简介 C语言是一种高级语言,运行效率仅次于汇编,支持跨平 ...
- 逍遥自在学C语言 | 变量、常量与数据类型
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.基本数据类型 1.整型 C语言中的整型数据如下表所示: ...
- 逍遥自在学C语言 | 算数运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.算数运算符简介 C语言的算数运算符,是用来完成基本的算术 ...
- 逍遥自在学C语言 | 逻辑运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 逻辑运算符是用来比较和操作布尔值的运算符 ...
- 逍遥自在学C语言 | 关系运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 关系运算符的作用是判断符号两边大小的关系 ...
- 逍遥自在学C语言 | 位运算符的基础用法
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表达方式 位运算符是一组用于在二进制数之间进行操作 ...
- 逍遥自在学C语言 | 位运算符&的高级用法
前言 在上一篇文章中,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位 ...
- 逍遥自在学C语言 位运算符 "|" 的5种高级用法
前言 在上一篇文章中,我们介绍了&运算符的高级用法,本篇文章,我们将介绍| 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是 ...
- 逍遥自在学C语言 | 位运算符^的高级用法
前言 在上一篇文章中,我们介绍了|运算符的高级用法,本篇文章,我们将介绍^ 运算符的一些高级用法. 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一 ...
- 逍遥自在学C语言 | 赋值运算符
前言 在C语言中,赋值运算符用于将一个值赋给变量 这个过程分为两个步骤: 计算赋值运算符右侧的表达式 将结果赋给左侧的变量. C语言提供了多个不同的赋值运算符,包括基本的赋值运算符.复合赋值运算符以及 ...
随机推荐
- jinjia2基本用法
前言这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题 于是乎,我自己开发了一款面试宝典,希望 ...
- [Linux]Vmwaer创建CENTOS7虚拟机
1 前期准备 CENTOS系统镜像 本实验版本: CENTOS 7.9 安装 VMware Workstation 本实验版本: VMware Workstation Pro 15.0 2 VMwar ...
- [网络/Linux]CentOS7:OpenSSH升级到7.9p1 | 含: 安装Telnet/OpenSSH【telnet/ssh】
[Q0 OpenSSH/sshd/ssh/scp/sftp,及OpenSSL这些软件组件之间有什么联系吗?] 请跳转咱的另一篇博文,相信阅读完后,你会清楚很多: [网络/SSH]OpenSSH: ss ...
- 从桌面和应用内 Activity的启动流程
1.APP还没有被打开过从桌面启动 <1>首先桌面进程会像AMS服务发送startActivity的请求,AMS从system_service中去拿----一次IPC通信 <2> ...
- [Pytorch框架] 4.3 fastai
文章目录 4.3 fastai 4.3.1 fastai介绍 fastai库 fast.ai课程 Github 4.3.2 fastai实践 MNIST 4.3.3 fastai文档翻译 import ...
- mysql基础_事务
定义 一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败. 例如:王五向赵六的账户上转 ...
- [ [Ynoi2013] 无力回天 NOI2017 ] 解题报告
[Ynoi2013] 无力回天 NOI2017 首先看到异或,想到能维护异或的东西就那几样(线性基/01trie/数位 dp/FWT),再看到求选任意个数后的异或最大值,线性基无疑了. 这时再看还要维 ...
- 「学习笔记」2-SAT问题
SAT 是适定性 (Satisfiability) 问题的简称.一般形式为 k - 适定性问题,简称 k-SAT.而当 \(k>2\) 时该问题为 NP 完全的.所以我们只研究 \(k=2\) ...
- pytes中fixture的scope: 决定可以在什么范围内共享fixture
1fixture的scope 在@pytest.fixture(scope='xxx')中,scope的可选值有5个,以下是官网的描述 2 function级别的scope 添加如下代码到pytest ...
- 代码打包的可视化数据分析图: webpack-bundle-analyzer 的使用
先看webpack-bundle-analyzer的效果图(官方效果图): 通过使用webpack-bundle-analyzer可以看到项目各模块的大小,可以按需优化 1.先安装 npm insta ...