C语言指针进阶 学习笔记

发布时间:2026/9/14 23:37:12

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/9/14 23:35:51

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

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

2026/9/11 8:20:36

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

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

2026/9/7 6:39:40

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

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

2026/9/14 23:36:15

伺服系统参数摄动下的H∞鲁棒控制器设计全流程解析

伺服系统位置控制里,最让人头疼的往往不是非线性摩擦,也不是机械谐振,而是惯量和阻尼系数随工况乱跑。你这一刀切下去的材料密度变了、夹具换了个更重的、或者负载直接怼上来,等效惯量J和阻尼B立马就不是铭牌上那个数了。更麻烦的…

2026/9/14 23:36:15

企业AI知识库四大卡点:切片、向量、权限、反馈

1. 这不是AI不聪明,是知识库没“长脑子”最近帮三家不同行业的客户做知识库升级,有做医疗器械售后的,有做金融合规培训的,还有做制造业设备维保的。他们提得最多的一句话是:“我们明明喂了几十个G的PDF、上百份SOP、几…

2026/9/14 23:36:15

AI 前沿日报 · 2026-09-12

AI 前沿日报 2026-09-12今日主题:Claude 设置 18 岁年龄门槛、Rogue AI 反 CAPTCHA、LLM 灌醉挖内核漏洞、AI 软件工厂与内容操纵地图一、头条与产品 Claude 的 18 岁门槛引发行业震动,编译器级 Agent 工具 Graphify 与 MCP 驱动的对战游戏 Clawfight 则…

2026/9/14 23:36:15

鸿蒙开发中的状态管理与事件处理实战解析

1. 状态管理与事件处理在鸿蒙开发中的核心价值作为鸿蒙开发者,状态管理和事件处理是构建高质量应用的两大基石。在ArkUI框架下,状态管理决定了数据如何流动和更新,而事件处理则负责用户交互的响应逻辑。这两者共同构成了鸿蒙应用动态性的核心…

2026/9/14 23:36:15

猪行为识别数据集工程处理:COCO标注解析与YOLOv8训练实战

简介:猪圈环境下猪行为识别数据集,聚焦智慧养殖与计算机视觉应用场景,适合从事深度学习目标检测或动物行为分析方向的开发者、研究人员与相关专业学生。数据集中图像均采集自猪圈实际监控画面,共计1272张JPG图片;配套3…

2026/9/14 23:31:15

支付宝游戏灵画师简易步骤整理

个人经验,仅供参考第一步:收获一波 活动 鱼获,秘宝 每日奖励, 仙盟商店,仙盟灵池, 画中阁,灵田,第二步:挑战一波 精英怪, 仙盟对决,仙盟挑战&…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/14 0:03:22

KCF目标跟踪算法与OTB工程实现:毕业设计实战解析

简介:这是一份基于KCF核相关滤波算法、融合尺度池与抗遮挡处理的目标检测跟踪MATLAB完整源码,主要面向计算机相关专业准备毕业设计、课程设计或期末大作业的学生,也适合需要项目实战练习的初学者。源码在OTB数据集上完成验证,能够…

2026/9/14 0:03:22

语音情感识别实战:Keras实现LSTM、CNN、SVM与MLP多模型对比

简介:面向语音情感识别入门与进阶开发者,这份基于Keras的项目源码完整实现了LSTM、CNN、SVM、MLP四种模型,兼容Python3.8与Keras/TensorFlow2环境。压缩包内含49个文件,大小约70.31MB,主体包括Python脚本、yaml/json配…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码