【问题标题】:Parameter passing and scope of array in C/C++C/C++ 中的参数传递和数组范围
【发布时间】:2012-01-30 02:33:58
【问题描述】:

这个问题一直困扰着我。我有一个数组,在它的声明范围内,我可以使用 sizeof 运算符来确定其中的元素数量,但是当我将它传递给函数时,它解释为只是指向数组开头的指针,并且sizeof 运算符只是给了我这个指针变量的大小。就像下面的例子一样,

#include<iostream>
int count(int a[]){
    return (sizeof(a)/sizeof(int));
}
int main(){
    int a[]={1,2,3,4,5};
    std::cout << sizeof(a)/sizeof(int) << " " << count(a) << std::endl;
    return 0;
}

代码的输出是5 2。如何将数组传递给函数,以便我可以仅使用 sizeof 运算符来确定其大小,而不必将额外的大小作为参数传递给该函数?

【问题讨论】:

  • 也可以考虑std::array(你需要一个 C++11 编译器)。
  • 如果你没有 C++11,你可以使用boost::array,这或多或少是一回事

标签: c++ arrays function parameters scope


【解决方案1】:
template<size_t N>
int count(int (&a)[N])
{
    return N;
}

【讨论】:

  • 感谢本杰明。你能告诉我如何在 c 中做同样的事情吗?
  • @sidharthsharma:不,我不能。
  • @sidharth sharma: 不能像您在 C 中描述的那样完成。当作为函数参数(以及在许多其他情况下)传递时,数组 decay 指向指针。所以你需要明确地传递大小。
  • @sidharth 等等,你问了一个关于 C++ 的问题,你想用 C 语言回答?
  • @sidharthsharma 这正是为什么编写“C/C++”并混淆这两种语言是一个坏主意的原因。
【解决方案2】:

你不能那样做。没有办法传递一个数组,使它携带它的大小信息。你必须自己做。您必须将计数作为附加参数传递。

【讨论】:

  • 这不是真的 - 请参阅本杰明的回答
  • @awoodland 但是,这是作弊,不是吗?它仅在显式维度数组声明在范围内时才有效。如果我有int myfunction( int[] a ),它将无法工作。
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 2017-08-17
  • 2016-08-26
  • 2015-04-23
  • 1970-01-01
  • 2021-01-29
  • 2012-04-27
相关资源
最近更新 更多