• 数组引用:C++ 数组做参数 深入分析


    转载:https://blog.csdn.net/jiangxinyu/article/details/7767065

    在 C++中,数组永远不会按值传递,它是传递第一个元素,准确地说是第 0个 的指针。

    例如,如下声明 :
    void putValues( int[ 10 ] ); 
    被编译器视为  
    void putValues( int* ); 
    数组的长度与参数声明无关,因此,下列三个声明是等价的: 
    // 三个等价的 putValues()声明 
    void putValues( int* ); 
    void putValues( int[] ); 
    void putValues( int[ 10 ] ); 

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


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

    2.  数组长度不是参数类型的一部分,函数不知道传递给它的数组的实际长度,编泽器也不知道,当编译器对实参类型进行参数类型检查时,并不检查数组的长度。例如:
    void putValues( int[ 10 ] ); // 视为 int* 

    int main() { 
    int i, j[ 2 ]; 
    putValues( &i ); // ok: &i 是 int*; 潜在的运行错误 
    putValues( j ); // ok: j 被转换成第 0 个元素的指针 
    // 实参类型为 int*: 潜在的运行错误 
    return 0; 

    参数的类型检查只能保证putValues()的两次调用都提供了int*型的实参,类型检查不能检验实参是一个 10元素的数组 。习惯上, C风格字符串是字符的数组,它用一个空字符编码作为结尾。但是所有其他类型,包括希望处理内含空字符的字符数组必须以某种方式在向函数传递实参时使其知道它的长度。

    一种常见的机制是提供一个含有数组长度的额外参数。例如:
    void putValues( int[], int size );
    int main() { 
           int i, j[ 2 ]; 
           putValues( &i, 1 ); 
           putValues( j, 2 ); 
           return 0; 
    }

    另外一种机制是将参数声明为数组的引用

    当参数是一个数组类型的引用时,数组长度成为参数和实参类型的一部分,编译器检查数组实参的长度与在函数参数类型中指定的长度是否匹配。 
    // 参数为 10 个 int 的数组 
    // parameter is a reference to an array of 10 ints 
    void putValues( int (&arr)[10] );//不能写成&arr[10],因为下标操作符的优先级较高
    int main() { 
           int i, j[ 2 ]; 
           putValues( i ); // 错误: 实参不是 10 个 int 的数组 
           putValues( j ); // 错误: 实参不是 10 个 int 的数组 
           return 0; 
    }

  • 相关阅读:
    POJ2481(树状数组:统计数字 出现个数)
    jenkins(2)-linux环境下jenkins启动/重启/停止命令
    jenkins(1)-部分插件由于缺少依赖无法加载。要恢复这些插件提供的功能,需要修复这些问题并重启Jenkins的解决办法
    linux(4)-rpm包安装
    charles(2)-charles如何打断点,修改Request数据
    charles(1)-charles如何打断点,修改Response数据
    linux(3)-普通用户如何切换到root
    jmeter(51) Groovy脚本高级实战
    jmeter(49)-jenkins+ant+jmeter持续集成接口自动化测试-(linux环境)
    Codeforces Round #545 (Div. 2)D(KMP,最长公共前后缀,贪心)
  • 原文地址:https://www.cnblogs.com/rednodel/p/10072193.html
Copyright © 2020-2023  润新知