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; // 危险!需要小心处理最佳实践总结
数组传参原则
- 总是传递数组大小作为单独参数
- 使用const保护不需要修改的数组
函数设计模式
// 修改数组voidprocess_array(type arr[],intsize);// 只读访问voidshow_array(consttype arr[],intsize);安全性考虑
- 优先使用const保护数据
- 考虑使用数组区间操作增加灵活性
- 避免混淆指针的const位置
自下而上的设计
- 先考虑数据结构和基本操作
- 再组合成完整程序
- 这是面向对象编程的基础
实际应用示例
房地产价值管理程序展示了如何将数组操作封装成函数,实现数据的填充、显示和修改,体现了良好的模块化设计思想。
通过掌握这些概念,你可以编写出更安全、更灵活的数组处理代码,为学习更高级的C++特性(如STL容器)打下坚实基础。
要点记忆:数组名是指针,传递数组就是传递地址,使用const保护数据,区间操作提供灵活性,const的位置决定保护什么。