新闻详情

新闻详情

首页 / 资讯中心 / 详情

C语言学习笔记十二 —— 指针补充(多指针 · 野指针 · void* · 排序查找指针版 · const · 字符串)

发布时间:2026/10/1 21:32:51来源:尧图网络
C语言学习笔记十二 —— 指针补充(多指针 · 野指针 · void* · 排序查找指针版 · const · 字符串)
一、指针补充1. 定义多个指针变量int*p;// 定义一个指针变量 pint*p,*q,*r;// 一次定义多个指针变量// * 是起修饰作用修饰变量名表示该变量是指针类型变量而不是普通变量inta,b,c,*p,*q;// 普通变量和指针变量可以混合定义注意定义时*是修饰用来说明是指针变量不是在取值2. 野指针野指针指针指向不明确。a. 指针变量未初始化——变量中可能是随机值 → 指针指向不明确野指针。int*p;// 野指针p 里是随机值不知道指向哪里3. NULL —— 空地址0号地址为了避免野指针定义指针时先赋 NULLint*pNULL;// 表示 p 的指向是明确的空地址 0号地址NULL 就是 0 号地址空地址判断指针是否有效if (p NULL) { ... }。4. void* —— 万能指针void// 空类型void*// 空类型指针 —— 万能指针可以接收任意类型的地址inta10;void*pa;// void* 可以指向任意类型5. 与 * 互为逆运算inta10;int*pa;*p// 等价于 (*p) p// 与 * 互为逆运算先解引用再取地址等于 p 本身二、排序指针版思路1. 选择排序思想给合适的位置选择合适的数。// 迭代的方式实现// begin —— 起始位置指针// end —— 结束位置指针for()// 用地址代表元素的位置条件 begin end{for(pbegin1;pend;){if()// p 位置上的值和 begin 位置上的值比较{swap();// 交换}}}voidselectArray(int*begin,int*end){int*pNULL;for(begin;beginend;begin){for(pbegin1;pend;p){if(*p*begin){intt*p;*p*begin;*begint;}}}}2. 冒泡排序思想相邻两个元素两两相比小的放前大的放后。for()// 控制趟数 —— 每一趟结束冒出一个数最大值冒到最后{for(?)// 一趟的比较过程从开头到结束位置{if()// 相邻比较{swap();// 交换}}}voidmp(int*begin,int*end){int*pNULL;int*bbegin;int*eend;for(begin;begine;begin,--end){for(pb;pend;p){if(*(p1)*p){intt*(p1);*(p1)*p;*pt;}}}}3. 插入排序思想从无序区拿数据插入到有序区。步骤① 拿数 ② 找位置 ③ 插入。for()// 通过指针拿数begin 起始位置{// 1. t 拿数// 2. int *q 准备要插入的位置while(qbegin*(q-1)t)// 前面的数比 t 大就往后挪{}*qt;// 插入到正确位置}voidcr(int*begin,int*end){int*pbegin;int*qNULL;for(pbegin;pend;p){intt*p;qp;while(qbegin*(q-1)t){*q*(q-1);--q;}*qt;}}三、查找二分查找指针版begin end// 0 1 2 3 4 5 6// b e// 1 2 3 4 5 6 8midbegin(end-begin)/2;// 中间位置if(*midn)// 要找的比中间小 → 去前半段{endmid-1;}elseif(*midn)// 要找的比中间大 → 去后半段{beginmid1;}else// 找到了{}返回值midint*—— 找到了返回位置指针NULL—— 空指针没找到。int*binaryFind(int*begin,int*end,intn){int*midNULL;int*retNULL;while(beginend){int*midbegin(end-begin)/2;if(*midn){endmid-1;}elseif(*midn){beginmid1;}else{retmid;break;}}returnret;}四、快速排序用到的知识① 指针 ② 递归 ③ 迭代思想分而治之——选一个基准值把比它小的放左边、比它大的放右边然后对左右两部分递归。voidquickSort(int*begin,int*end){int*pbegin;int*qend;//1.找基准值首元素int*kbegin;if(beginend)//7.递归结束的条件当begin与end错开或者相遇{return;}while(beginend)//5.{//2.从右往左找到第一个比基准值小的while(beginend*end*k){--end;}//3.从左往右找第一个比基准值大while(beginend*begin*k){begin;}//4.找到以后交换这两个值2和3的swap(begin,end);//5.重复2~4,直到begin与end相遇}//6.将相遇位置上的值与基准值交换swap(begin,k);//7.递归下去quickSort(p,end-1);//小的一部分quickSort(begin1,q);//大的一部分}五、小结指针操作整型一维数组指针很灵活指针可以代表位置指针也可以实现间接访问。六、指针操作字符型一维数组字符串本身也是按照字符型一维数组的方式存储到计算机中——字符串是一种特殊的字符型一维数组。chars[]hello;// 操作字符串指针操作 s 中的数据只需要获得首元素地址s[0]// char 类型s[0]// char *char*ps[0];// p 指向首元素s;// 数组名就是首元素地址等价写法七、const 修饰符const表示将所修饰的变量限定为只读。修饰原则就近原则——离谁近就限定谁。inta;// 普通变量可读可写constinta;// a 此时只读不能修改constchar*p;// 限定通过 *p 方式访问基类型为只读*p 不能修改基类型charconst*p;// 同上等价写法char*constp;// 限定 p 本身为只读p 不能被修改不能换指向constchar*constp;// p 不能被修改*p 也不能被修改const 在函数参数中的应用intputs(constchar*s);// const char *s —— 设计函数的一种方式puts 函数功能是把 s 中的字符串输出。建议如果函数只是做读操作参数建议写成 const 形式好处避免出问题出问题也能及早发现提高参数的适用性。能传什么给const char *参数char*// 指针数组名// 如 shello// 字符串常量constchar*// 常量指针八、表示字符串的两种方式chars[]hello;// 使用栈空间上的字符串可修改char*shello;// 使用字符串常量区中的字符串不可修改constchar*shello;// 更准确的写法明确告知是只读的字符串常量九、strcpy 的 const 版本char*strcpy(char*dest,char*src);// 普通写法char*strcpy(char*dest,constchar*src);// 改进src 只读不修改原因strcpy 只读 src 的内容不改 src所以 src 用const char *更安全。补充总结int *p,*q,*r;中*是修饰作用野指针 指针指向不明确未初始化NULL用来避免野指针void *万能指针与*互为逆运算*p p三种排序选择/冒泡/插入、二分查找都可以用指针begin/end/mid实现快速排序 指针 递归 分而治之const 就近原则只读函数参数用const char *字符串两种表示栈空间可改vs 字符串常量区只读。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

从园区能源账单到答辩PPT:能源服务工程毕设的AI工具怎么选? 2026/10/1 23:40:08

从园区能源账单到答辩PPT:能源服务工程毕设的AI工具怎么选?

如果你学的是能源服务工程,大概率会遇到一类很“综合”的毕业设计:给某个园区、工厂或公共建筑做一套综合能源服务方案。比如围绕“分布式光伏 储能 充电桩 空调节能改造”,完成现状用能分析、负荷测算、方案配置、经济性评价、碳减排分析…

阅读更多 →
AI Agent全栈开发实战:从工具调用到生产部署的工程化指南 2026/10/1 23:40:08

AI Agent全栈开发实战:从工具调用到生产部署的工程化指南

1. 从标题拆解这个速成计划的真实含金量“AI Agent全栈开发 高薪工程师速成计划”这个标题,乍一看像是培训机构惯用的营销话术,但如果你真的在招聘网站上翻过最近半年的岗位JD,就会发现一个很现实的情况:大量中小型公司正在招“能…

阅读更多 →
GPM 2.0实战指南:崩溃排查从小时级到分钟级的工程化落地 2026/10/1 23:40:08

GPM 2.0实战指南:崩溃排查从小时级到分钟级的工程化落地

1. 这不是又一个“升级公告”,而是我们团队踩着线上崩溃警报声写出来的实战手册GPM 2.0这个词最近在技术群里刷屏,但很多人点开文档一看——满屏“智能感知”“全链路闭环”“治理提效”,反而更迷糊了。我带团队做过6个大型App的线上质量攻坚…

阅读更多 →
YOLOv11路面导航标志识别:从Roboflow数据集到训练部署全流程 2026/10/1 23:40:07

YOLOv11路面导航标志识别:从Roboflow数据集到训练部署全流程

简介:这是一份面向道路机器人视觉识别与自动驾驶导航场景的YOLOv11标注数据集资源,适合目标检测入门学习者、机器人开发者以及交通标志识别算法研究人员使用。资源涵盖407张真实道路场景图像,这些图像多取自路面视频抽帧,包含交通…

阅读更多 →
MagicDraw中文显示方块问题排查:字体配置与Java渲染详解 2026/10/1 23:40:01

MagicDraw中文显示方块问题排查:字体配置与Java渲染详解

前一阵我在用MagicDraw整理一套UML状态图,状态名、触发事件、备注全部用中文命名。图都画到一半了,第二天打开项目,画布上所有中文全变成了整整齐齐的小方块——不是乱码,不是问号,是那种空心矩形,像是一夜…

阅读更多 →
Vite proxy解决本地跨域:核心配置、字段详解与生产替代方案 2026/10/1 23:40:01

Vite proxy解决本地跨域:核心配置、字段详解与生产替代方案

遇到过吧?本地Vue项目跑在5173端口,后端服务跑在8080端口,前端一调接口,浏览器的Network里明明有请求,控制台却一直报CORS错误。页面加载不出来,后端日志里也没看到请求进来。很多人第一反应是让后端加Cros…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉