【问题标题】:Is there a difference between a pointer parameter and an array parameter?指针参数和数组参数有区别吗?
【发布时间】:2014-04-21 16:20:34
【问题描述】:

void method(double *v)

void method(double v[5])

这两者有什么区别吗?

第二个是否更具体,例如 v 的长度被限制为 5 个元素?

【问题讨论】:

    标签: c++ arrays pointers types


    【解决方案1】:

    当声明为参数类型时,数组会衰减为指针类型。在您的示例中,

    void method(double v[5]);
    

    这里5 根本没有任何作用,它是如此的微不足道,你可以完全省略它,而是这样写:

    void method(double v[]);
    

    这与之前的声明完全相同。由于它衰减成指针,所以上面两个完全一样:

    void method(double *v); //because array decays to pointer, anyway
    

    也就是说,以下都是同一个函数的声明:

    void method(double v[5]); //ok : declaration 
    void method(double v[]);  //ok : redeclaration of the above
    void method(double *v);   //ok : redeclaration of the above
    

    所有都完全相同。完全没有区别。

    请注意,以下内容有所不同:

    void f(double (&v)[5]); 
    

    它声明了一个函数,该函数可以采用 精确 5 大小的双精度数组。如果您传递任何其他大小的数组(或者如果您传递指针),则会出现编译错误!

    【讨论】:

      【解决方案2】:

      没有也没有。

      在函数参数中,它们是相同的,编译器将参数double v[5] 视为一个指针。大小5被忽略了,最多给程序员一个信号。

      C++ 11 §8.3.5 函数第 3 节

      [ ... ] 确定每个参数的类型后,将“T的数组”或“函数返回T”类型的任何参数调整为“指向T的指针”或“指向T的指针”函数分别返回T,”。

      【讨论】:

      • 除了第二种情况你可以得到数组的长度,我想?如果你传入一个 double[6] 会发生什么?我希望第一种情况可以工作,但第二种情况会产生错误。
      • @DavidLively 你的意思是在函数内部?不,你不能,它是一个指向编译器的指针。
      • 对于函数参数列表的编译器检查,数组[5] 被认为与数组[10] 不同。
      • 奇怪 - 我希望这是按值传递的,但我的快速测试应用程序表明情况并非如此。
      • @Nawaz 是的,非常有道理。谢谢。
      猜你喜欢
      • 2010-10-11
      • 2015-02-07
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2016-02-03
      • 2010-09-14
      相关资源
      最近更新 更多