指针(3):strlen的模拟实现和传址调用
指针3strlen的模拟实现和传址调用1.strlen的模拟实现1.1 streln的介绍1.2 strlen的模拟实现1.3 注意1.4 补充2.传址调用1.strlen的模拟实现1.1 streln的介绍库函数strlen的功能是求字符串的长度统计的是字符串中\0之前的字符的个数函数原型如下size_tstrlen(constchar*str);参数str接收⼀个字符串的起始地址然后开始统计字符串中 \0 之前的字符个数最终返回⻓度。strlen的运用#includestdio.h#includestring.hintmain(){intretstrlen(abcdef);printf(%d,ret);return0;}字符串“abcdef”在内存中实际存储的是a b c d e f \0共7个字节strlen只统计\0之前字符的数量因此输出结果为6。1.2 strlen的模拟实现根据上面对strlen函数原型的分析我们可以得知如果要模拟实现只要从起始地址开始向后逐个字符的遍历只要不是 \0 字符计数器就1这样直到 \0 就停⽌。接下来就让我们来完成strlen模拟实现的代码#includestdio.hsize_tmy_strlen(constchar*str){size_tcount0;while(*str){str;count;}returncount;}intmain(){size_tretmy_strlen(abcdef);printf(%zu\n,ret);return0;}首先将 “abcdef” 传到函数my_strlen中设置一个计数器count用来统计该字符串\0之前的字符的个数通过while循环遍历该字符串\0之前的字符每循环一次指针向后移动一位并且使得计数器count加一遍历完成后返回count函数模拟完成1.3 注意通过观察我们可以发现模拟函数实现时我们定义的用来接收my_strlen的ret的类型为size_t无符号整数类型而上面我们在运用strlen时用来接收其返回值时用的ret的类型为int但最后输出结果都正确这是为什么呢。这是因为字符串“abcdef”中字符数量太小用int来接收也足够当字符数量够大时用int接收就会出现错误所以最好是使用size_t 和 %zu来接收和打印当然在字符串比较小的时候也可以用int 和 %d来接收和打印。此外还有一个需要注意的点由于strlen的返回值是无符号整数因此两个strlen相减是不能得到负数的看下面这个例子if(strlen(hi)-strlen(hello)0)在这个例子中看似strlen(“hi”)得到数是2strlen(“hello”)得到的数是42 - 4 0,但是strlen返回值是size_t不存在负数只用正数因此strlen(“hi”) - strlen(“hello”所得到的值是一个很大的无符号正数因此这个式子永远大于0.1.4 补充根据之前章节里面所提到的指针-指针我们可以用另一种方式来实现strlen的模拟实现即首先记录指针的起始位置然后遍历字符串得到指针结束时的位置用结束指针-起始指针即可得到字符的数量。#includestdio.hsize_tmy_strlen(constchar*str){constchar*startstr;while(*str){str;}returnstr-start;}intmain(){size_tretmy_strlen(abcdef);printf(%zu\n,ret);return0;}注意指针相减得到的数字是有符号整数类型但return时会将其隐式转化size_t类型因此无需进行强制类型转化。2.传址调用我们学习指针是为了解决问题那么有哪些问题是只有指针才能解决的呢我们来看这样一个问题写一个函数交换两个整型变量的值。经过一番思考我们可能会写出这样的代码#includestdio.hvoidswap(intx,inty){intc0;cx;xy;yc;}intmain(){inta5;intb3;swap(a,b);printf(%d %d,a,b);return0;}让我们运行起来看看是否能够达到目的我们发现这并没有产生交换的后果这是为什么呢让我们来通过调试观察一下。我们发现在main函数内部创建了变量a b他们的地址分别为0x000000026dc6ff6c4 和 0x000000026dc6ff6e4而在调用swap函数时我们将 a 和 b 传递给swap函数swap函数在函数内部创建了形参x 和 y用来接收a 和 b的值但是x的地址是0x000000026dc6ff6a0y的地址是0x000000026dc6ff6a8x和y确实接收到了a和b的值不过x的地址和a的地址不⼀样y的地址和b的地址不⼀样相当于x和y是独⽴的空间而我们又知道数据都是存储在地址所对应的内存单元当中他们的地址不同因此他们所对应的内存单元也就不同那么在swap函数内部交换x和y的值⾃然不会影响a和b当swap函数调⽤结束后回到main函数a和b的值没法交换。这就是传值调⽤因此我们可以得出结论实参传递给形参的时候形参会单独创建⼀份临时空间来接收实参对形参的修改不影响实参。因此swap失败了那我们该怎么办呢其实只需要将a和b的地址传递给swap函数让swap函数通过地址间接的操作a和b的值这样就能够达到交换a和b的值的功能了。#includestdio.hvoidswap(int*x,int*y){intc0;c*x;*x*y;*yc;}intmain(){inta5;intb3;swap(a,b);printf(%d %d,a,b);return0;}由此我们看到代码成功的完成了任务这⾥调⽤swap函数的时候是将变量的地址传递给了函数这种函数调⽤⽅式叫传址调⽤传址调⽤可以让函数和主调函数之间建⽴真正的联系在函数内部可以修改主调函数中的变量所以未来函数中只是需要主调函数中的变量值来实现计算就可以采⽤传值调⽤。如果函数内部要修改主调函数中的变量的值就需要传址调⽤。

相关新闻

网易版《我的世界》皮肤上传全攻略:从PNG到上架资源中心的工程化实践

网易版《我的世界》皮肤上传全攻略:从PNG到上架资源中心的工程化实践

1. 这篇文章真正要解决的问题你是否曾想过,在《我的世界》里,让全世界玩家都用上你亲手设计的皮肤?或者,你是否已经设计了一个酷炫的皮肤,却苦于无法将它安全、便捷地分享给朋友,甚至上架到官方平台&#x…

2026/9/15 6:25:01 阅读更多 →
影石 Insta360 新款 X6 发布:更小机身、更强性能,售价 699.99 美元起!

影石 Insta360 新款 X6 发布:更小机身、更强性能,售价 699.99 美元起!

影石 Insta360 推出新款 X6,丰富产品线我跟玩儿运动相机的朋友们说啊,影石 Insta360 宣布推出其热门 360 度运动相机的新一代产品啦,这也助力该公司进一步丰富了产品线。X6 设计与性能升级新款 X6 的设计比去年的 X5 和 X4 Air 更小&#xff…

2026/10/11 5:02:23 阅读更多 →
MemPalace:为LLM构建长期记忆系统的工程实践指南

MemPalace:为LLM构建长期记忆系统的工程实践指南

1. 项目概述:当AI拥有“记忆宫殿”最近在AI圈子里,一个名为“MemPalace”的开源项目引起了不小的轰动。它被戏称为“生化危机女主角亲自开源”,这个有趣的梗源于其项目主页上一位酷似游戏角色的虚拟形象。抛开这个吸引眼球的外壳,…

2026/10/13 21:53:48 阅读更多 →

最新新闻

基于MP2642GR-Z与PIC18F87K22的2S电池主动均衡模块设计

基于MP2642GR-Z与PIC18F87K22的2S电池主动均衡模块设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:14:56 阅读更多 →
SPFA负环检测实战:POJ 2240套利问题与对数转化技巧

SPFA负环检测实战:POJ 2240套利问题与对数转化技巧

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:14:56 阅读更多 →
Android本地MP3播放器实战:MediaPlayer状态机与前台服务设计

Android本地MP3播放器实战:MediaPlayer状态机与前台服务设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:14:56 阅读更多 →
51单片机汽车自动照明系统:光敏+超声波协同远近光智能控制

51单片机汽车自动照明系统:光敏+超声波协同远近光智能控制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:14:56 阅读更多 →
SLS只读助手:会话权与日志读权限拆开

SLS只读助手:会话权与日志读权限拆开

人只能给指定数字员工开会话,员工再用单独角色读日志。两层写进同一条策略,就会出现打得开却查不到,或者名单可见的库被整库读走。 目录 前言 一、会话权和读日志权拆开 二、开工前只读盘点 三、角色只读指定 Logstore 四、人的策略只绑一组、只对一名员工

2026/10/15 1:14:56 阅读更多 →
Apollo-11 自动化任务调度框架:状态机与插件化设计实践

Apollo-11 自动化任务调度框架:状态机与插件化设计实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 1:13:56 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →