news 2026/4/17 23:37:08

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/4/16 14:34:11

智慧农产品销售|基于java+ vue智慧农产品销售系统(源码+数据库+文档)

智慧农产品销售 目录 基于springboot vue智慧农产品销售系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue智慧农产品销售系统 一、前言 博主介绍…

作者头像 李华
网站建设 2026/4/18 5:40:26

将Dify集成到CI/CD流水线中的技术挑战与解决方案

将Dify集成到CI/CD流水线中的技术挑战与解决方案 在企业加速拥抱大语言模型&#xff08;LLM&#xff09;的今天&#xff0c;AI应用早已不再是实验室里的“演示项目”&#xff0c;而是需要稳定运行、持续迭代的生产系统。然而&#xff0c;现实却常常令人尴尬&#xff1a;一个智…

作者头像 李华
网站建设 2026/4/18 5:44:36

GDScript编程入门:从零开始掌握游戏开发核心技能

GDScript编程入门&#xff1a;从零开始掌握游戏开发核心技能 【免费下载链接】learn-gdscript Learn Godots GDScript programming language from zero, right in your browser, for free. 项目地址: https://gitcode.com/gh_mirrors/le/learn-gdscript 你曾梦想亲手创造…

作者头像 李华
网站建设 2026/4/18 8:18:20

FreeModbus主机模式实用指南:嵌入式工业通信协议栈深度解析

FreeModbus主机模式实用指南&#xff1a;嵌入式工业通信协议栈深度解析 【免费下载链接】FreeModbus_Slave-Master-RTT-STM32 Add master mode to FreeModbus. | 在 FreeModbus 中添加主机模式 项目地址: https://gitcode.com/gh_mirrors/fr/FreeModbus_Slave-Master-RTT-STM…

作者头像 李华