发布时间:2026/7/30 10:02:32
C语言指针进阶 学习笔记 职坐标学习C语言指针进阶 学习笔记一、字符指针1. 核心概念定义char *ptr;指向字符类型数据的指针。基本用法可以指向单个字符也可以指向字符数组字符串。2. 字符串常量与字符数组 这是字符指针中最容易混淆的概念也是文档的重点。定义方式代码示例内存存储位置可修改性相同字符串地址字符指针const char *p hello;常量区 (只读)不可修改 (通过指针)相同 (指向同一块内存)字符数组char arr[] hello;栈区 (可读写)可修改不同 (各自开辟新内存)结论字符指针指向字符串常量后不能通过指针修改字符串内容如 *(p1) a; 会报错。C/C 会优化字符串常量相同的字符串常量在内存中只有一份所以不同指针指向相同字符串时地址是相同的。字符数组每次定义都会在栈上开辟新的内存块所以地址不同。3. 常量指针 vs 指针常量常量指针 (const char *p)含义指向常量的指针。特点指针指向的内容不能通过该指针修改但指针本身可以改变指向可以指向别的地址。代码示例 const char *p hello; // p[0] H; // 错误不能修改指向的内容 p world; // 正确指针可以指向新的地址指针常量 (char * const p)含义指针本身是常量。特点指针本身不能改变指向初始化后不能指向别处但可以通过指针修改指向的内容。代码示例const char *p hello;// p[0] H; // 错误不能修改指向的内容p world; // 正确指针可以指向新的地址二、指针数组与数组指针 这两个概念仅一字之差但含义完全不同。1. 指针数组定义数据类型 *数组名[长度]; (如 int *p[5];)本质是一个数组数组里的每个元素都是指针。内存存放了多个地址。用途常用于存储多个字符串或管理多个数组。代码示例int a 1, b 2;int *ptrArr[2] {a, b}; // 定义一个指针数组printf(%d, *ptrArr[0]); // 输出 12. 数组指针定义数据类型 (*指针名)[长度]; (如 int (*p)[5];)本质是一个指针指向一个数组。内存只存放一个地址数组的首地址。用途常用于操作二维数组。步长p1 跳过的是整个数组的大小例如 int[5] 跳过 20 字节。代码示例int arr[3] {1, 2, 3};int (*p)[3] arr; // 定义一个数组指针指向包含3个int的数组printf(%d, (*p)[0]); // 输出 1*p 解引用得到数组arr3. 快速区分口诀[] 优先级高于 *。int *p[5]p 先和 [] 结合所以是数组。int (*p)[5]() 强制 p 先和 * 结合所以是指针。三、数组参数与指针数组参数1. 数组传参在函数参数中int arr[]、int arr[10] 和 int *arr 本质上是等价的都退化为指向首元素的指针。2. 指针数组传参形式1void func(int *arr[], int len) —— 明确表示是指针数组。形式2void func(int **ptr, int len) —— 使用二级指针接收。原因指针数组名代表首元素地址而首元素本身就是一个指针int*所以数组名的类型是 int**。代码示例void printPtrArray(int **p, int len) {for(int i 0; i len; i) {printf(%d , *p[i]); // 通过二级指针访问}}}四、函数指针与指针函数1. 函数指针定义指向函数的指针。语法返回值类型 (*指针变量名)(参数列表);示例int (*p)(int, int) getMax;调用(*p)(1, 2) 或 p(1, 2)。代码示例int add(int a, int b) { return a b; }int main() {int (*func_ptr)(int, int) add; // 定义并赋值int result func_ptr(3, 4); // 通过指针调用printf(%d, result); // 输出 7return 0;}2. 指针函数定义返回值是指针的函数。语法返回值类型* 函数名(参数列表);示例int* func(int a);注意不能返回局部变量的地址因为函数结束时局部变量会被销毁通常返回静态变量、全局变量或堆内存的地址。代码示例int* getStaticAddr() {static int num 100; // 必须是static或全局变量return num; // 返回静态变量的地址}3. 对比速记函数指针本质是指针指向函数。指针函数本质是函数返回指针。五、回调函数1. 概念通过函数指针调用的函数。把函数的指针地址作为参数传递给另一个函数当这个指针被用来调用其所指向的函数时就称为回调。2. 实现步骤1.定义回调函数类型使用 typedef 定义函数指针类型。typedef void (*CallbackType)(int);2.实现具体的回调函数编写实际功能的函数如 void myFunc(int t)3.编写接收回调的函数该函数的参数包含回调函数指针。void doWork(CallbackType cb, int t) { cb(t); }4.调用在 main 函数中将具体函数名作为参数传递。3. 代码示例#include stdio.h// 1. 定义回调函数类型typedef void (*CookingCallback)(int);// 2. 实现具体的回调函数void makeFish(int time) {printf(清蒸鱼蒸 %d 分钟\n, time);}void makeMeat(int time) {printf(红烧肉炖 %d 分钟\n, time);}// 3. 编写接收回调的函数void startCooking(CookingCallback callback, int time) {printf(起锅烧油...\n);callback(time); // 调用传进来的函数printf(出锅\n);}int main() {// 4. 调用startCooking(makeFish, 10); // 传入 makeFish 函数startCooking(makeMeat, 60); // 传入 makeMeat 函数return 0;}六、核心知识点速记卡知识点关键总结字符指针char *p str 指向常量区不可改char arr[] 在栈区可改。指针数组int *p[5]数组存指针常用于存多个字符串。数组指针int (*p)[5]指针指数组常用于二维数组传参。函数指针int (*p)(int)指向函数的指针实现多态/回调。指针函数int* func()返回地址的函数勿返局部变量地址。回调函数函数指针作为参数传递实现“策略模式”或解耦。二级指针int **p用于接收指针数组名或修改一级指针的指向。学习建议区分优先级重点练习 * 和 []、() 的结合优先级这是区分“指针数组”和“数组指针”、“函数指针”和“指针函数”的关键。理解内存画图理解字符串常量在常量区而数组在栈区这解释了为什么一个能改一个不能改。实战回调尝试写一个简单的计算器或排序算法如 qsort 的比较函数体会回调函数的灵活性。

相关新闻

2026/7/30 10:02:32

国产桌面Agent横评:LobsterAI在4个工程师敏感指标上的突围表现

深度解析:桌面AI助理技术选型的四大核心指标与工程实践 当桌面级AI助理从概念走向落地,技术选型的核心矛盾已从「能否实现」转向「如何控风险」。本文基于数十个企业级部署案例,拆解国内主流产品的技术方案,为工程师提供深度选型…

2026/7/30 10:02:32

无线动能开关|商业商超灵活氛围控灯方案

一.系统概述大型商超、购物中心、连锁商铺专柜迭代更新频繁,商品陈列、专柜布局、橱窗场景经常调整,对灯光控制的灵活性要求极高。传统固定布线开关点位死板,专柜移位、业态更新时需要重新布线改开关,施工周期长、影响门店营业&am…

2026/7/30 9:57:32

监控系统中NTP网络时间服务器的应用

NTP网络时间服务器在监控系统中的应用具有显著的技术必要性。 一、技术背景与需求分析 现代化监控系统通常由大量网络摄像头(IPC)、网络硬盘录像机(NVR)、管理平台及各类传感器组成。这些设备各自依靠内部晶振独立计时&#xff0c…

2026/7/30 10:47:36

AI直播软件怎么选?2026 AI直播工具硬核测评:萤瓴AI、讯飞智作、火山引擎、商汤如影选型指南

核心速览2026年直播电商合规监管趋严、真人主播人力与排班成本持续上涨,半无人AI直播已经成为实体门店、中小电商、品牌矩阵运营的标准降本方案。市面主流AI直播工具分为轻量化语音实时交互与企业级数字人多模态直播两大赛道。经过全场景实测与官方参数交叉核验&…

2026/7/30 10:47:36

音频文件大小计算

储存容量大小采样频率(Hz) 量化位数(b) 采样声道数 采样时间(s)例题:录制一段时长8S,采样频率44.1KHz,位深16bit,双声道立体声的音频文件,问其…

2026/7/30 10:47:36

零数科技区块链平台服务六大领域,打造多个国家级示范项目

数据孤岛是产业数字化进程中一道顽固的壁垒。不同行业、不同企业之间的数据标准各异,互信机制缺失,导致大量高价值数据沉睡在系统内部,无法跨领域流动创造增量价值。如何打破行业壁垒,构建可信的数据协作网络,是释放数据要素乘数效应的前提。零数科技选择从产业场景中寻找答案。…

2026/7/30 10:47:36

一键重装工具选型与象牙装机大师实践解析

面向读者:对系统重装不熟悉、希望用较低学习成本完成 Windows 重装的普通用户,以及需要在多台设备上批量维护系统的办公用户。本文解决的核心问题是:在众多一键重装工具中,如何基于安全性、易用性、兼容性做出选型,并以…

2026/7/30 10:47:36

零基础搭建个人网站:宝塔面板+WordPress实战指南

1. 项目概述:从零到一,构建你的数字名片 “我想做个网站”,这可能是很多人在某个时刻都会冒出的想法。无论是想展示自己的作品集、开个线上小店,还是记录生活点滴,拥有一个专属的网站,就像是拥有了一个24小…

2026/7/30 10:42:35

WIZnet串口转以太网模块选型与实战指南

1. WIZnet串口转以太网模块选型指南:从原理到实战在工业自动化、智能家居和物联网设备开发中,串口设备联网一直是个高频需求场景。作为从业十余年的嵌入式工程师,我几乎用过市面上所有主流的串口转以太网方案,WIZnet的硬件协议栈芯…

2026/7/29 22:32:30

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/7/30 0:01:39

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:01:39

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/29 13:12:43

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…