C++数组参数应用方式探讨(转)

简介:

对于经验丰富的编程人员来说,C++编程语言应该是他们经常使用于程序开发的一种实用性语言。那么,在C++中,C++数组参数永远不会按值传递。它是传递第一个元素(准确地说是第0个)的指针。

例如,如下声明:

  1. void putValues(int[10]); 

被编译器视为:

  1. void putValues(int*); 

C++数组参数的长度与参数声明无关。因此,下列三个声明是等价的:

  1. void putValues(int*);  
  2. void putValues(int[]);  
  3. void putValues(int[10]); 

因为数组被传递为指针,所以这对程序员有两个含义:

1、在被调函数内对参数数组的改变将被应用到数组实参上而不是本地拷贝上。当用作实参的数组必须保持不变时,程序员需要保留数组的拷贝。函数可以通过把参数类型声明为const来表明不希望改变数组元素:

  1. void putValues(const int[10]); 

2、数组长度不是参数类型的一部分。函数不知道传递给它的数组的实际长度,编译器也不知道,当编译器对实参类型进行参数类型检查时,并不检查数组的长度。
例如:

  1. void putValues(int[10]); //视为int*  
  2. int main()  
  3. {  
  4. int i, j[2];  
  5. putValues(&i); //ok:&i是int*; 潜在的运行错误  
  6. putValues(j); //ok:j被转换成第0个元素的指针  
  7. // 实参类型为int*:潜在的运行错误  
  8. return 0;  

参数的类型检查只能保证putValues()的再次调用都提供了int*型的实参。类型检查不能检验实参是一个10元素的数组。

习惯上,C风格字符串是字符的数组,它用一个空字符编码作为结尾。但是所有其他类型,包括希望处理内含字符的字符数组,必须以某种方式在向函数传递实参时使其知道它的长度。一种常见的机制是提供一个含有C++数组参数的长度的额外参数。例如:

  1. void putValues(int[], int size);  
  2. int main()  
  3. {  
  4. int i,j[2];  
  5. putValues(&i, 1);  
  6. putValues(j, 2);  
  7. return 0;  

另外一种机制是将参数声明为数组的引用。当参数是一个数组类型的引用时,数组长度成为参数和类型的一部分,编译器检查数组实参的长度与在函数参数类型中指定的长度是否匹配。

  1. // 参数为10个int的数组  
  2. // parameter is a reference to an array of 10 ints  
  3. void putValues(int (&arr)[10]);  
  4. int main()  
  5. {  
  6. int i, j[2];  
  7. int a[10];  
  8. putValues(i); // 错误:实参不是10个int的数组  
  9. putValues(j); // 错误:实参不是10个int的数组  
  10. putValues(a); // 正确  
  11. return 0;  

因为C++数组参数的长度现在是参数类型的一部分,所以putValues()的这个版本只接受10个int的数组。这限制了可以作为实参被传递给putValues()的数组的种类。但是,它也使函数的实现更加简单。



本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/3263941.html,如需转载请自行联系原作者

相关文章
|
11天前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
2天前
|
程序员 C++ 容器
C++编程基础:命名空间、输入输出与默认参数
命名空间、输入输出和函数默认参数是C++编程中的基础概念。合理地使用这些特性能够使代码更加清晰、模块化和易于管理。理解并掌握这些基础知识,对于每一个C++程序员来说都是非常重要的。通过上述介绍和示例,希望能够帮助你更好地理解和运用这些C++的基础特性。
10 0
|
25天前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
32 2
|
26天前
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
35 4
|
1月前
|
存储 搜索推荐 Serverless
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
【C++航海王:追寻罗杰的编程之路】哈希的应用——位图 | 布隆过滤器
27 1
|
18天前
|
C++ 索引
C++数组、vector求最大值最小值及其下标
C++数组、vector求最大值最小值及其下标
43 0
|
26天前
|
存储 编译器 C++
C++多态实现的原理:深入探索与实战应用
【8月更文挑战第21天】在C++的浩瀚宇宙中,多态性(Polymorphism)无疑是一颗璀璨的星辰,它赋予了程序高度的灵活性和可扩展性。多态允许我们通过基类指针或引用来调用派生类的成员函数,而具体调用哪个函数则取决于指针或引用所指向的对象的实际类型。本文将深入探讨C++多态实现的原理,并结合工作学习中的实际案例,分享其技术干货。
35 0
|
2月前
|
算法 编译器 程序员
C++为什么有参数依赖查找(ADL)?
为什么在限定名称查找和非限定名称查找之外,C++还要提供参数依赖查找这样的机制呢?它其实是在规范的查找框架下,提供了一种灵活性的补充
|
2月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
20 6
|
2月前
|
存储 安全 C++
开发与运维数组问题之声明一个数组如何解决
开发与运维数组问题之声明一个数组如何解决
38 6