C 数组参数应用方式探讨
创始人
2024-06-22 17:50:40
0次

对于经验丰富的编程人员来说,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;  
  9. } 

参数的类型检查只能保证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;  
  8. } 

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

  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;  
  12. } 

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

【编辑推荐】

  1. C++获取当前路径实现技巧分享
  2. C++反射机制具体实现方法详解
  3. C++模板限制实际应用方式探讨
  4. C++字符串分割函数具体使用方法总结
  5. C++异常传递三种不同方式介绍

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
只需三步,让你掌握阿尔法路由器... 请参照以下阿尔法路由器设置方法,通过浏览器进入及设置宽带路由器。经过这三个步骤的设置,基本上能够熟悉...
如何更省钱? 近期特价热门硒鼓... 如今激光打印设备已经成为商务或企业的绝对主力办公设备,但采购者往往忽视了激光打印设备所用的耗材,相对...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...