【问题标题】:Proper syntax for passing array to function将数组传递给函数的正确语法
【发布时间】:2013-04-25 17:58:51
【问题描述】:

如果我用这样的方式声明一个数组:

const char var[]="Some message here";

然后有一个函数通过接受指向数组的指针来打印此消息,如下所示:

void printMessage(char *msg)

那么如果我这样调用这个函数有什么区别:

printMessage(var);

或者这个:

printMessage(&var[0]);

那么调用这个函数的更正确的方法是什么?

【问题讨论】:

  • 两者是相等的,但是第一个写的少(也是最常用的)。
  • 事实上你不能将数组传递给函数;您只能将指针传递给数组的第一个元素(或者,不太常见的是,指向整个数组的指针)。阅读comp.lang.c FAQ 的第 6 节;它很好地解释了 C 数组和指针之间经常令人困惑的关系。

标签: c arrays syntax


【解决方案1】:

技术上没有区别——var 在字面上等同于&var[0]

使用哪个部分是个人喜好,部分可读性和部分一致性。例如,如果您打算在某处使用var 调用该函数,而在另一处使用&var[n] 调用该函数,那么我会主张在第一次调用中使用&var[0] 作为可读性帮助。

【讨论】:

  • 在这种情况下它们是等价的。它们完全不同,例如,sizeof 的参数。
  • 授予...但问题非常具体是关于将数组传递给函数,而不是通用数组引用。不过,我承认,很容易将 sizeof() 误认为是函数调用。
【解决方案2】:

var&var[0] 都等于 char 数组中第一个成员的地址。

前者对数组最简单。

后者可用于将 std::vector 传递给接受数组地址的函数。

【讨论】:

    【解决方案3】:

    它们在 C 中是相同的。如果您有 C 数组或 C 指针,请使用较短的语法。

    在处理 c++ 中的向量时,我使用较长的语法,以明确发生了什么:

    void f(const double * arry);
    void g() {
        std::vector<double> vec = //.....
        f(&(vec[0]));
    }
    

    【讨论】:

      【解决方案4】:

      对于类似的事情,我只是传递var,但是当我进行指针运算时,我使用&amp;var[3] 的较长形式而不是var + 3,因为我认为它更清楚地表明我是做指针运算。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-09
        • 1970-01-01
        • 2014-05-09
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多