【问题标题】:C++ * vs [] as a function parameterC++ * vs [] 作为函数参数
【发布时间】:2012-06-01 10:02:42
【问题描述】:

有什么区别:

void foo(item* list)
{
    cout << list[xxx].string;
}

void this(item list[])
{
    cout << list[xxx].string;
}

假设项目是:

struct item
{
    char* string;
}

指针指向字符数组的第一个

list 只是一个项目数组...

【问题讨论】:

    标签: c++ arrays pointers parameters struct


    【解决方案1】:

    对于编译器来说,没有区别。

    虽然读起来不一样。 [] 建议您将数组传递给函数,而 * 也可能意味着只是一个简单的指针。

    请注意,数组在作为参数传递时会衰减为指针(以防您还不知道)。

    【讨论】:

    • +1 表示“请注意,数组在作为参数传递时会衰减为指针”。我不知道,很有趣。
    • 不仅数组表达式会衰减为指针,当您将数组类型指定为函数参数时,它实际上会更改为指针类型以用于所有目的,包括重载、sizeof 和@987654324 @。您甚至可以以一种方式声明它并以另一种方式定义它(但您可能不应该)。
    • 最好添加标准中的文本,以免给人以数组和指针大体相同的印象。函数参数只是一种特殊情况,标准规定“在确定每个参数的类型后,将任何类型为“T 数组”[...] 的参数调整为“指向 T”的指针 [...]。” [dcl.fct] 8.3.5/5.
    【解决方案2】:

    它们是相同的 - 完全是同义词。第二个是item list[],而不是item[]list

    但是,当参数用作数组时,习惯上使用[],而当参数用作指针时,习惯上使用*

    【讨论】:

      【解决方案3】:

      仅供参考:

      void foo(int (&a)[5]) // only arrays of 5 int's are allowed
      {
      }
      
      int main()
      {
        int arr[5];
        foo(arr);   // OK
      
        int arr6[6];
        foo(arr6); // compile error
      }
      

      但是foo(int* arr)foo(int arr[])foo(int arr[100])都是等价的

      【讨论】:

        猜你喜欢
        • 2013-03-10
        • 1970-01-01
        • 1970-01-01
        • 2015-05-08
        • 1970-01-01
        • 2011-02-21
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多