【问题标题】:Change of behavior when passing int array [duplicate]传递int数组时的行为变化[重复]
【发布时间】:2012-07-13 01:44:34
【问题描述】:

可能重复:
Passing an array as an argument in C++
Sizeof an array in the C programming language?

您能否解释一下以下代码的输出:

#include<iostream>
using namespace std;

void foo(int array[])
{
    int size = sizeof(array) / sizeof(array[0]);    
    cout<<size<<endl;
}
int main()
{
    int array[] = {1,2,3};

    int size = sizeof(array) / sizeof(array[0]);
    cout<<size<<endl;
    foo(array);
    return 0;
}

对应的输出是:

3
2

foo()ma​​in() 里面的代码看起来和我很相似,以便产生相同的输出,但事实并非如此,你能解释一下吗为什么?

【问题讨论】:

  • ARhgh,糟糕的学习材料又来了。这里没有传递数组。
  • 总结:每当您将数组作为参数传递时,您也需要传递长度。更好的是只使用std::vector

标签: c++ c arrays pointers


【解决方案1】:

您不是将 array 传递给函数,而是将 pointer 传递给数组。

也就是说,在函数foo()中,sizeof(array)的结果是指向char数组的指针的大小,不是数组本身的大小,所以函数是有效地做到这一点:

cout << sizeof(int *) / sizeof(array[0]);

在这种情况下,int * 的大小为 8,int 的大小为 4,因此您从函数中得到 2 的输出。

【讨论】:

  • 数组元素是int,而不是char。没有改变观点,但你仍然应该纠正它。 (sizeof(char*) != sizeof(int*) 是允许的。)
  • @DanielFischer,好的,谢谢!出于某种原因,我认为它是 'char array[]' 而不是 'int array[]' 在 OP 的帖子中
【解决方案2】:
void foo(int array[]) 

在 C 或 C++ 中,您不能按值传递数组,因此上述声明被解释为:

void foo(int * array)

考虑通过引用传递数组:

template <size_t N>
void foo( int(&array)[N] )
{   
    cout << N << endl;
}

【讨论】:

  • 这不是一个真正的答案,因为问题是“为什么输出的结果不同?”
猜你喜欢
  • 2018-02-07
  • 2017-03-29
  • 1970-01-01
  • 2015-11-28
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多