news 2026/5/22 8:09:43

C++函数与数组的深度结合:指针、常量与区间操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++函数与数组的深度结合:指针、常量与区间操作

C++函数与数组的深度结合:指针、常量与区间操作

数组与函数基础

在C++中,数组名实际上是一个指向数组第一个元素的指针。这是理解数组函数参数传递的关键。

intsum_arr(intarr[],intn);// 等同于 int sum_arr(int *arr, int n);

核心概念解析

1. 数组名即指针

intcookies[8]={1,2,4,8,16,32,64,128};// cookies == &cookies[0] // true// cookies的类型是 int*

2. 重要恒等式

arr[i]==*(arr+i)// 访问元素&arr[i]==arr+i// 获取地址

3. 数组传参的本质

当传递数组给函数时,实际传递的是:

  • 数组首地址
  • 数组元素类型信息
  • 需要单独传递元素数量
intsum=sum_arr(cookies,8);// 传递地址和大小

数组处理函数的编写模式

1. 修改数组的函数

voidmodify_array(doublearr[],intn){for(inti=0;i<n;i++)arr[i]*=2;// 修改原始数组}

2. 不修改数组的函数(使用const保护)

voidshow_array(constdoublearr[],intn){for(inti=0;i<n;i++)cout<<arr[i]<<" ";// 只读访问}

完整的数组操作示例

// 1. 填充数组intfill_array(doublearr[],intlimit){inti;for(i=0;i<limit;i++){cout<<"Enter value #"<<(i+1)<<": ";cin>>arr[i];if(arr[i]<0)break;// 负数结束输入}returni;// 返回实际填充的数量}// 2. 显示数组(const保护)voidshow_array(constdoublearr[],intn){for(inti=0;i<n;i++)cout<<"Element "<<i<<": "<<arr[i]<<endl;}// 3. 修改数组voidrevalue(doublefactor,doublearr[],intn){for(inti=0;i<n;i++)arr[i]*=factor;}

数组区间操作

C++提供更灵活的数组处理方式——使用指针区间:

intsum_arr(constint*begin,constint*end){constint*pt;inttotal=0;for(pt=begin;pt!=end;pt++)total+=*pt;returntotal;}// 使用示例intarr[8]={1,2,4,8,16,32,64,128};inttotal=sum_arr(arr,arr+8);// 整个数组intfirst3=sum_arr(arr,arr+3);// 前3个元素intlast4=sum_arr(arr+4,arr+8);// 后4个元素

指针与const的四种组合

1. 指向常量的指针

intage=39;constint*pt=&age;// 不能通过pt修改age// *pt = 40; // 错误!

2. 常量指针

intage=39;int*constpt=&age;// pt不能指向其他地址pt=&other;// 错误!*pt=40;// 正确,可以修改值

3. 指向常量的常量指针

intage=39;constint*constpt=&age;// 既不能修改指针,也不能修改值

4. 多层间接关系中的const

constint**pp2;// 指向const指针的指针int*p1;constintn=13;// pp2 = &p1; // 危险!需要小心处理

最佳实践总结

  1. 数组传参原则

    • 总是传递数组大小作为单独参数
    • 使用const保护不需要修改的数组
  2. 函数设计模式

    // 修改数组voidprocess_array(type arr[],intsize);// 只读访问voidshow_array(consttype arr[],intsize);
  3. 安全性考虑

    • 优先使用const保护数据
    • 考虑使用数组区间操作增加灵活性
    • 避免混淆指针的const位置
  4. 自下而上的设计

    • 先考虑数据结构和基本操作
    • 再组合成完整程序
    • 这是面向对象编程的基础

实际应用示例

房地产价值管理程序展示了如何将数组操作封装成函数,实现数据的填充、显示和修改,体现了良好的模块化设计思想。

通过掌握这些概念,你可以编写出更安全、更灵活的数组处理代码,为学习更高级的C++特性(如STL容器)打下坚实基础。


要点记忆:数组名是指针,传递数组就是传递地址,使用const保护数据,区间操作提供灵活性,const的位置决定保护什么。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 12:45:21

Graylog日志管理平台:从混乱日志到清晰洞察的完整解决方案

还在为海量日志数据感到头疼吗&#xff1f;每天面对成百上千台服务器产生的日志&#xff0c;想要快速定位问题却无从下手&#xff1f;Graylog作为一款免费开源的日志管理平台&#xff0c;正是为解决这些问题而生。它能帮助您集中收集、存储、分析和可视化来自各种来源的日志数据…

作者头像 李华
网站建设 2026/5/20 12:21:38

Qwerty Learner VSCode 插件终极使用指南

Qwerty Learner VSCode 插件终极使用指南 【免费下载链接】qwerty-learner-vscode 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 VSCode 摸&#x1f41f;版 / Words learning and English muscle memory training software designed for keyboard workers for VSCode 项…

作者头像 李华
网站建设 2026/5/22 4:04:53

Node-RED UI Builder实战指南:从零构建数据驱动的Web应用界面

Node-RED UI Builder实战指南&#xff1a;从零构建数据驱动的Web应用界面 【免费下载链接】node-red-contrib-uibuilder Easily create data-driven web UIs for Node-RED using any (or no) front-end framework. 项目地址: https://gitcode.com/gh_mirrors/no/node-red-con…

作者头像 李华
网站建设 2026/5/21 18:22:09

终极指南:3步彻底卸载OneDrive,释放Windows系统潜能

终极指南&#xff1a;3步彻底卸载OneDrive&#xff0c;释放Windows系统潜能 【免费下载链接】OneDrive-Uninstaller Batch script to completely uninstall OneDrive in Windows 10 项目地址: https://gitcode.com/gh_mirrors/one/OneDrive-Uninstaller 还在为OneDrive占…

作者头像 李华
网站建设 2026/5/20 17:02:05

从权限到架构:彻底搞懂Android手机安装Open-AutoGLM的3大门槛

第一章&#xff1a;我的手机不能安装Open-AutoGLM在尝试将 Open-AutoGLM 部署至移动设备时&#xff0c;许多用户反馈其手机无法成功安装该应用。这一问题通常源于系统兼容性、权限设置或安装源限制等多方面因素。检查设备系统要求 Open-AutoGLM 目前仅支持 Android 10 及以上版…

作者头像 李华
网站建设 2026/5/20 22:21:08

如何快速安装Beat Saber模组:ModAssistant完整使用指南

如何快速安装Beat Saber模组&#xff1a;ModAssistant完整使用指南 【免费下载链接】ModAssistant Simple Beat Saber Mod Installer 项目地址: https://gitcode.com/gh_mirrors/mo/ModAssistant 想要为Beat Saber游戏添加更多乐趣和功能吗&#xff1f;ModAssistant是专…

作者头像 李华