zoukankan      html  css  js  c++  java
  • C++中数组参数详解 冷夜

    在C++中,数组永远不会按值传递。它是传递第一个元素(准确地说是第0个)的指针。
    例如,如下声明:
      void putValues(int[10]);
    被编译器视为:
      void putValues(int*);
    数组的长度与参数声明无关。因此,下列三个声明是等价的:
      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]);
    int main()
    {
        
    int i, j[2];
        
    int a[10];
        putValues(i); 
    // 错误:实参不是10个int的数组
        putValues(j); // 错误:实参不是10个int的数组
        putValues(a); // 正确
        return 0;
    }
    复制代码

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

  • 相关阅读:
    轻重搭配
    EF的优缺点
    使用bootstrap-select有时显示“Nothing selected”
    IIS发布 HTTP 错误 500.21
    js添加的元素无法触发click事件
    sql server查看表是否死锁
    sql server把一个库表的某个字段更新到另一张表的相同字段
    SQLSERVER排查CPU占用高的情况
    SQL server中如何按照某一字段中的分割符将记录拆成多条
    LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
  • 原文地址:https://www.cnblogs.com/gamesky/p/2689076.html
Copyright © 2011-2022 走看看