尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
指针03——字符、数组、函数指针
1.字符指针变量字符指针是char*类型下边是基本用法#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int main() { char ch d; char* pc ch; return 0; }这就是最基础的用法一个字符类型存一个字符取地址后地址保存在pc字符指针变量中还有其他用法。#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int main() { char* pstr hello world; return 0; }这里是把字符串的地址放在pstr中了吗其实并不是他只是把“hello world”的首字符地址存在pstr中了可以发现上面结论是正确的因为首字符地址和整个字符串的地址是一样的。#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int main() { char pstr1[20] { hello world }; char pstr2[20] { hello world }; char* pstr3 hello world; char* pstr4 hello world; if (pstr1 pstr2) { printf(pstr1pstr2\n); } else { printf(pstr1!pstr2\n); } if (pstr3 pstr4) { printf(pstr3pstr4\n); } else { printf(pstr3!pstr4\n); } return 0; }看一下这个代码他的输出结果是什么为什么有这个结果我一步步解释首先我们创建了两个字符数组用来存储字符串在内存中创建了两块空间分别存放这两个数组即使他们的内容是一样的其实这个也很好理解吧主要是第二个之所以说pstr3pstr4是因为用字符指针指定的字符串并非数组他是不能改变内容的既然我们不能对它做修改那内存为了省空间自然也没必要专门开辟两块空间存储两个完全一样的内容。2.数组指针数组指针是指针本质和整形指针、字符指针是一样的都是存储对应类型的指针顾名思义数组指针存储的整个数组的地址下边是一个基本的数组指针变量#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int main() { int arr[10] { 0 }; int (*parr)[10] arr; return 0; }如代码所见创建一个数组将数组的地址传给数组指针变量parrparr的类型是int(*)[10]从上边的例子也可以看到数组指针变量初始化的时候需要用对应的数组地址赋值所谓对应用上述例子来说明其实前边的int很好理解但需要注意的是后边的10这个大小是一定要相等的以往我们初始化数组的时候为了避免越界可以给大空间不完全初始化但这里是需要严格对应的。那接下来我就要讲一下二维数组了请大家回忆一下我们说过二维数组也是数组数组名也是首元素地址二维数组的首元素是一个一维数组所以二维数组数组名的类型其实是一个数组指针。那么整个数组的地址和数组首元素地址区别大吗首先需要明确他们都是从数组的首元素开始的只不过在1或者时数组首元素指针跳过数组类型大小的空间而数组地址直接跳过整个数组指向数组后边的那一块空间加其他数同理。3.函数指针变量内存可以存储我们常见的变量比如说指针变量、整型变量等等但万物都并非凭空出现函数既然能运行那他必有一个实体存在换句话说同样有一个类型的指针存储函数的地址以便调用对应函数而存储这个函数地址的变量就叫做函数指针变量。#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h void test() { printf(hello world\n); } int main() { void (*pf1)() test; void (*pf2)() test; printf(pf1%p\n, pf1); printf(pf2%p\n, pf2); return 0; }下边这段代码是为了演示两种函数指针类型的初始化方式也就是说函数名和函数名其实是等价的。这里的函数指针类型就是void (*)()同理假如一个返回值是int参数是两个int的函数他对应的函数指针类型是int (*)(int,int)或者int (*)(int x,int y),前提是函数定义里两个形参名字是x和y。那么问题来了函数指针类型有啥用#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int add(int a, int b) { return a b; } int main() { int (*pf)(int, int) add; int a 3; int b 5; printf(ab%d\n, pf(a, b)); printf(ab%d\n, (*pf)(a, b)); return 0; }如你所见可以用来调用函数那可能你就要接着问了为什么不直接函数名传参调用呢这不是多此一举吗那么我给大家看一段代码#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h int add(int a, int b) { return a b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int div(int a, int b) { return a / b; } void menu() { printf(输入1加法\n); printf(输入2减法\n); printf(输入3乘法\n); printf(输入4除法\n); printf(输入0退出\n); } void comp(int(*pf)(int, int),int a,int b) { printf(%d\n, pf(a, b)); } int main() { int input 0; do { int a 0; int b 0; printf(输入操作的两个数); scanf(%d %d, a, b); menu(); scanf(%d, input); switch (input) { case 1: comp(add, a, b); break; case 2: comp(sub, a, b); break; case 3: comp(mul, a, b); break; case 4: comp(div, a, b); break; default: break; } } while (input); return 0; }你仔细看看我这个代码思考一下如果用传统方式传参调用函数那么代码会多么冗余这就是函数指针变量的意义所在。相信你也看到了一些细节比如我用了函数指针数组存储加减乘除四个函数的地址那么函数指针数组又是什么顾名思义函数指针数组就是存储函数指针的数组跟整型数组、字符数组等其实没有本质区别int(*parr[10])(int,int) parr就是一个函数指针数组。可能你会觉得有一些混淆因为确实数组指针也好函数指针也好写起来都有点麻烦那么我要介绍一种类型重定义技巧可以帮忙简化这些问题其实就是利用typedeftypedef unsigned int uint; typedef int(*pf)(int, int); typedef int(*parr)[10];上述是常见的typedef使用方式注意数组指针和函数指针都是把重定义的类型名放在中间了。
RELATED

相关推荐

Apache Paimon 数据出仓源码导读(六):UPDATE 与 DELETE 如何落库:主键归并、UPSERT 与跨批空窗

Apache Paimon 数据出仓源码导读(六):UPDATE 与 DELETE 如何落库:主键归并、UPSERT 与跨批空窗

上一篇,我们跟着四条 RowData 走完了 JDBC Sink:记录逐条进入,按主键进入 Buffer,满足条件后通过 executeBatch() 批量访问 MySQL。 这一篇继续追问:UPDATE 到了 MySQL,为什么不一定执行普通 UPDATE&#x…

📅 2026/10/7 23:04:34
#工程图纸AI识图实战:气泡图自动标注的原理、流程与踩坑(2026)

#工程图纸AI识图实战:气泡图自动标注的原理、流程与踩坑(2026)

作者:做了五年品质管理的一线质量人 | 更新时间:2026-09 | 全文基于真实使用经历,实测数据为个人环境结果 给赶时间的同行,先说结论: 气泡图自动标注的核心是图纸结构化数据提取,&qu…

📅 2026/10/25 22:23:42
Linux 网络通信基础|OSI 模型、IP 与端口详解

Linux 网络通信基础|OSI 模型、IP 与端口详解

网络通信 网络通信:不同主机,进程间通信。 网络协议 1.基本概念 1. OSI七层模型 OSI模型: open system interconnect 理论模型各种不同体系结构的计算机能在世界范围内互联成网。 协议: 应用层:要传输的数据信息,如文件传输&#…

📅 2026/10/15 14:17:12
MORE NEWS

更多资讯

📰

跨境电商数据中台架构设计与实战应用

1. 项目背景与核心价值 跨境零售行业近年来呈现爆发式增长态势,但随之而来的数据管理难题也日益凸显。我在为多家跨境电商企业提供技术咨询时发现,这些企业普遍面临着订单数据分散在10余个海外平台、用户行为日志存储在5种不同系统、供应链数据与财务系统…

📰

Kappa架构在金融风控中的实时流处理实践

1. Kappa架构与金融风控的天然契合 第一次接触Kappa架构是在2018年某股份制银行的实时反欺诈系统改造项目中。当时我们面临的核心痛点是:传统Lambda架构中批处理和实时处理两套代码的维护成本居高不下,而风控规则每周至少迭代3-4次的频率让团队疲于奔命。…

📰

C++ STL list底层原理与高效应用指南

1. 深入理解C STL list的底层结构与核心特性 1.1 双向循环链表:list的物理实现 在C标准模板库(STL)中,list容器本质上是一个带头结点的双向循环链表。这个设计决定了它与其他序列容器(如vector、deque)截然不同的行为特征。让我们拆解这个结构的每个关键…

📰

大模型实操指南:从本地部署到PPT级可控生成

1. 这不是“学大模型”,而是重建你和信息世界的关系“大模型相关内容的研究学习”——看到这个标题,我第一反应是笑。不是嘲笑,是那种在实验室熬了三个通宵、刚调通一个LoRA微调任务后,盯着终端里跳出来的loss曲线突然失语的笑。因…

📰

高效查找第K大元素:排序、堆与快速选择算法对比

1. 问题描述与核心挑战 给定整数数组 nums 和整数 k,我们需要找到数组中第 k 个最大的元素。请注意,这里要求的是排序后的第 k 个最大元素,而不是第 k 个不同的元素。 这个问题看似简单,但隐藏着几个关键挑战: 当数组…

📰

企业设备数字化管理:易点易动系统实践指南

1. 设备管理在企业数字化转型中的核心价值 设备管理作为企业资产管理的重要组成部分,正在经历从传统人工记录向数字化、智能化管理的转变。在制造业、医疗、教育等行业,设备资产往往占据企业总资产的60%以上,其管理效率直接影响企业运营成本和…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬