传递int数组时的行为更改

时间:2012-07-13 08:10:42

标签: c++ c arrays pointers

  

可能重复:
  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()内部和 main()内部的代码看起来与我类似,以便产生相同的输出,但它没有,请你解释一下为什么呢?

2 个答案:

答案 0 :(得分:4)

void foo(int array[]) 

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

void foo(int * array)

考虑通过引用传递数组:

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

答案 1 :(得分:3)

您没有将数组传递给函数,而是将指针传递给数组。

这意味着,在函数foo()中,sizeof(array)的结果是指向char数组的指针的大小,不是数组本身的大小,所以这个功能实际上是这样做的:

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

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