学习C语言第七天
6.2.1指针运算#include stdio.h int main(void) { char ac[] {0,1,2,3,4,5,6,7,8,9,};// 声明长度为10的字符数组 char *p ac; // p指向ac数组的第一个元素ac[0] printf(p%p\np) // 打印ac[0]的地址例如0x7ffd09 printf(p1%p\np1);// 地址1移动sizeof(char)1字节例如0x7ffd0a printf(*(p1)%d\n*(p1));// 解引用p1 等价于ac[1]的值输出1 *(pn)-ac[n]// *(pn) ac[n] 是指针运算核心特征 int ai[] {0,1,2,3,4,5,6,7,8,9,};// 声明长度为10的整型数组 int *q ai; // q指向ai[0] printf(q%p\n, q); // 打印ai[0]的地址例如0x7ffd30 printf(q1 %p\n, q1); // 地址4移动sizeof(int)4字节例如0x7ffd34 printf(*(q1)%d\n, *(q1)); // 解引用q1 ai[1]的值输出1 return 0; }指针基本运算1.基本算术运算指针±整数本质根据指针类型自动计算步长int arr[5] {10,20,30,40,50}; int *p arr; // p指向arr[0] p p 3; // 移动3个int单位实际地址12字节 // 现在p指向arr[3]值40特殊规律char*每次±1字节int*每次±4字节32位系统double*每次±8字节2.指针自增/自减/--典型应用遍历数组char str[] hello; char *c str; while(*c ! \0) { printf(%c, *c); c; // 自动移动sizeof(char)1字节 } 等效于 for(int i0; str[i]!\0; i) { printf(%c, str[i]); }3.指针相减仅限同类型指针作用计算元素间隔数int arr[10] {0}; int *p1 arr[2]; // 指向第3个元素 int *p2 arr[5]; // 指向第6个元素 int gap p2 - p1; // 结果是3不是字节差 // 实际计算(地址差)/sizeof(int)4.关系运算 用途判断指针位置关系int *p arr; int *end arr 10; while(p end) { // 检查是否越界 *p 0; // 清零 p; } 注意不同类型指针比较是未定义行为5.指针与数组的等价关系黄金法则arr[i] ≡ *(arr i) arr[i] ≡ arr i 示例 int arr[3] {1,2,3}; printf(%d, *(arr1)); // 输出2等同于arr[1]6.特殊运算void*指针特点可存储任意类型地址但不能直接运算int num 10; void *vp num; // 必须强制类型转换后才能运算 int *p (int*)vp 1; // 合法易错点警报野指针运算未初始化的指针操作会崩溃int *p; // 未初始化 p; // 危险2.越界访问int arr[5]; int *p arr 10; // 越界3.不同类型指针运算char *cp; int *ip; if(cp ip) { /* 编译器会警告 */ }*p的运作原理*p相当于「先取指针当前指向的值再把指针往后挪一步」。⚠️ 注意是移动指针本身不是修改指针指向的值1.取出p所指的那个数据来完事之后顺便把p移到下一个位置去2.*的优先级虽然高但是没有高常用于数组类的连续空间操作3.在某些CPU上这可以直接被翻译成一条汇编指令指针比较,,,!都可以对指针做比较它们在内存中的地址数组中的单元的地址肯定是线性递增的0地址0地址是计算机内存中编号为0的存储单元相当于内存世界的原点坐标。但在现代操作系统中它如同现实中的皇宫禁区——物理存在但禁止随意访问。指针没有被真正初始化先初始化为0NULL是一个预定定义的符号表示0地址有的编译器不愿意你用0来表示0地址指针的类型无论指向什么类型所有的指针的大小都是一样的因为都是地址但是指向不同类型的指针是不能直接互相赋值的这是为了避免用错指针指针的类型转换void*表示不知道指向什么东西的指针计算时与char*相同但不相通指针也可以转换类型int *p i; void*q (void*)p;这并没有改变p所指的变量的类型而是让后人用不同的眼光通过p看它所指的变量我不再当你是int啦我认为你就是个void6.2.2动态内存分配mallocmalloc是 C 语言中“memory allocation”内存分配的缩写它的作用是在程序运行时向系统申请一块指定大小的内存空间。你可以把它想象成“向操作系统借一块空地”用来存放你的数据比如整数、数组、结构体等。malloc 就是“按需借内存用完必须还借之前先看有没有借到检查 NULL还了之后别再用置 NULL”。与普通变量如int a;在编译时就确定好内存不同malloc 让你可以在程序运行过程中根据需要临时决定要多大内存这叫做“动态内存分配”。比如你写一个程序用户输入一个数字 N你想创建一个长度为 N 的数组用int arr[N];在早期的 C 标准中是不允许的因为数组大小必须是常量但用 malloc 就可以轻松搞定malloc(N * sizeof(int))。关键点头文件#include stdlib.h或#include malloc.h函数原型void *malloc(size_t size);返回值成功 → 返回一个void*类型的指针指向分配好的内存块的首地址失败 → 返回NULL分配的内存不会自动初始化里面的值是随机的垃圾值用法四步法1️⃣ 包含头文件#include stdlib.h // malloc 和 free 都在这里2️⃣ 调用 malloc 分配内存并检查是否成功int *p (int *)malloc(sizeof(int) * 10); // 申请 10 个整数的空间 if (p NULL) { // 分配失败处理错误 printf(内存不够了\n); return 1; }为什么加(int *)malloc 返回的是void*无类型指针在 C 中必须强制转换在 C 中虽然不是必须但建议转换方便移植。为什么检查 NULL如果系统内存不足malloc 会返回 NULL不检查就直接使用会导致程序崩溃空指针解引用。3️⃣ 使用分配的内存for (int i 0; i 10; i) { p[i] i * 2; // 像普通数组一样使用 }4️⃣ 用完后释放内存并置空指针free(p); // 把内存“还”给系统 p NULL; // 避免 p 变成“野指针”释放内存非常重要否则会导致“内存泄漏”——程序占用的内存越来越多最终系统资源耗尽。释放后把指针置空可以防止后面误用这个指针比如再次 free 或者解引用。#include stdio.h #include stdlib.h int main(void) { int number; int* a;inti; printf(输入数量); scanf(%dnumber);// int a[number]; a (int*)malloc(number*sizeof(int)); fori0;inumberi){ scanf(%da[i]); } for(inumber-1i0i--){ printf(%d ,a[i]); } return 0 }常见坑与最佳实践1️⃣ 内存泄漏只分配不释放就像借了东西不还。每个 malloc 必须对应一个 free否则程序长时间运行后会耗尽内存。2️⃣ 野指针 / 悬挂指针释放内存后指针仍然指向那块地址但系统已经收回。如果继续使用行为是未定义的可能崩溃或数据错乱。释放后立即置 NULL。3️⃣ 忘记检查返回值如果 malloc 返回 NULL比如内存不足直接使用指针会导致程序崩溃。永远要检查 if (ptr NULL)。4️⃣ 分配大小错误比如malloc(1)却想存一个int4字节会导致越界破坏其他数据。用sizeof(类型)计算正确大小。5️⃣ 多次释放同一块内存第一次 free 后指针没有置 NULL再次 free 会导致未定义行为。将指针置 NULL 后free(NULL) 是安全的。freefree是 C 语言中用来释放动态内存的函数与malloc、calloc、realloc配对使用。你可以把它想象成“把借来的内存还回去”——之前用malloc向系统“借”了一块内存用完之后用free“还”给系统让这块内存可以被其他程序或后续代码再次使用。free就是“借了要还还了别再用还之前检查是不是借的还之后把借条销毁置 NULL”。关键点头文件#include stdlib.h函数原型void free(void *ptr);参数指向之前由malloc/calloc/realloc分配的内存块的指针。返回值无void。核心原则谁申请谁释放成对出现。用法1. 基本语法int *p (int *)malloc(10 * sizeof(int)); // 申请内存 // 使用 p... free(p); // 释放内存 p NULL; // 将指针置空防止野指针2. 使用步骤第1步确认指针指向的是动态分配的内存free只能释放通过malloc、calloc或realloc在堆区开辟的内存绝对不能用于释放栈区变量如数组或全局变量。// ✅ 正确释放堆区内存 int *p (int *)malloc(40); free(p); // ❌ 错误释放栈区数组 int arr[10] {0}; free(arr); // 未定义行为第2步释放前检查指针是否为空如果指针是NULLfree什么都不会做这是安全的。但如果指针未初始化指向随机地址直接free会导致崩溃。int *p NULL; free(p); // ✅ 安全什么也不做第3步释放后将指针置为 NULL这是最关键的一步释放后指针仍然指向原来的地址但该地址已不属于程序这叫做悬空指针Dangling Pointer。如果不置空后续误用这个指针会造成非法访问可能导致程序崩溃。free(p); p NULL; // 彻底切断联系注意为什么要用 free—— 避免内存泄漏内存泄漏是指程序在运行过程中只申请内存却不释放导致系统可用内存越来越少最终程序可能因内存不足而崩溃。举个生活例子你向朋友借了一本书看完后不还朋友书架上的书就会越来越少。如果每个借书的人都不还最后谁都借不到书了。free就是“还书”这个动作。关键原则每个malloc必须对应一个free否则程序长期运行后内存会逐渐被耗尽。

相关新闻

KeymouseGo:5步掌握零编程自动化,告别重复鼠标点击工作

KeymouseGo:5步掌握零编程自动化,告别重复鼠标点击工作

KeymouseGo:5步掌握零编程自动化,告别重复鼠标点击工作 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo …

2026/7/25 2:37:42阅读更多 →
AM574x接口设计实战:从引脚配置到硬件调试避坑指南

AM574x接口设计实战:从引脚配置到硬件调试避坑指南

1. 从引脚表到设计图:如何真正读懂AM574x的接口手册刚拿到AM574x这类高性能异构处理器的数据手册时,很多工程师,尤其是从软件转过来的朋友,可能会被那一百多页的“引脚配置与功能”章节给吓到。满屏的表格,动辄几百个信…

2026/7/25 2:37:42阅读更多 →
ContextNest:基于AGPL的Claude Code上下文管理CLI工具详解

ContextNest:基于AGPL的Claude Code上下文管理CLI工具详解

在日常使用 Claude Code 进行开发协作时,你是否遇到过这样的困扰:上下文信息分散在不同对话中,团队成员的配置无法统一管理,敏感信息缺乏有效保护?ContextNest 正是为了解决这些问题而生的开源解决方案。本文将详细介绍…

2026/7/25 2:37:42阅读更多 →
2026微信小程序开发大赛全攻略:从环境配置到创新实践

2026微信小程序开发大赛全攻略:从环境配置到创新实践

面向全球开发者:2026 微信小程序开发大赛参赛全攻略 近期微信官方正式宣布2026微信小程序开发大赛启动,这是面向全球开发者的重要技术赛事。作为微信生态的重要组成部分,小程序开发已经成为移动开发领域的关键技能。本文将全面解析大赛参赛要…

2026/7/25 4:03:53阅读更多 →
AI驱动的学术写作导航系统:NLP与知识图谱融合实践

AI驱动的学术写作导航系统:NLP与知识图谱融合实践

1. 项目概述:当学术写作遇上AI导航去年帮导师审阅研究生论文时,一个现象让我印象深刻:超过70%的学术写作时间消耗在文献梳理环节。新手研究者常陷入"找不全、读不完、理不清"的困境,这种痛点催生了我们的书匠策AI项目。…

2026/7/25 4:03:53阅读更多 →
DeepSeek大模型在结构动力学中的创新应用

DeepSeek大模型在结构动力学中的创新应用

1. 项目背景与核心价值结构动力学作为工程领域的经典学科,在建筑抗震、机械振动、航空航天等领域有着广泛应用。传统分析方法常受限于计算效率和模型精度,而大模型技术的出现为这一领域带来了革命性突破。DeepSeek作为国产大模型的代表,其强大…

2026/7/25 4:03:53阅读更多 →
DM505 GPMC时序配置实战:从原理到高速稳定通信的实现

DM505 GPMC时序配置实战:从原理到高速稳定通信的实现

1. 项目概述与核心价值在嵌入式系统开发,尤其是涉及高速数据交换的领域,比如车载摄像头、工业视觉或者复杂的工控主板,我们常常会遇到一个看似简单实则棘手的问题:处理器明明性能强劲,但连接外部存储器或传感器时&…

2026/7/25 4:03:53阅读更多 →
Claude Code版本更新导致代码质量下降的技术分析与解决方案

Claude Code版本更新导致代码质量下降的技术分析与解决方案

1. 事件背景与现象观察最近在开发者社区中,关于Claude Code(某AI编程助手)的更新争议持续发酵。大量用户反馈最新版本在代码生成质量上出现显著倒退,主要集中表现为:复杂工程任务的完成度下降明显(用户实测…

2026/7/25 4:03:53阅读更多 →
Unity Asset Bundle分析器:透视资源包,优化游戏性能与包体

Unity Asset Bundle分析器:透视资源包,优化游戏性能与包体

1. 项目概述:为什么我们需要一个Asset Bundle分析器?如果你在Unity项目里用过Asset Bundles,大概率经历过这种场景:项目上线前,打包出来的Asset Bundle体积巨大,或者运行时加载某个Bundle时内存飙升&#x…

2026/7/25 4:01:52阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 1:01:14阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 1:01:14阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/25 1:01:14阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →