C ++数组上的Sizeof()在一个函数中起作用,但在另一个函数中起作用

时间:2011-07-11 21:54:36

标签: c++ arrays sizeof

我正在尝试更多地了解数组,因为我是编程新手。所以我正在玩不同的代码部分,并试图了解三件事,sizeof()。如何找到数组的长度,以及如何将数组放入函数(作为参数)?

我的代码是:

#include <iostream>

using namespace std;

void arrayprint(int inarray[])
{
    for (int n_i = 0 ; n_i < (sizeof(inarray) / sizeof(int)) ; n_i++)
    {
        cout << inarray[n_i] << endl;
    }
}

int main()
{
    int n_array[5];
    for (int n_i = 0 ; n_i < (sizeof(n_array) / sizeof(int)) ; n_i++ )
    {
        cin >> n_array[n_i];
    }
    arrayprint(n_array);
    return 0;
}

sizeof(inarray) / sizeof(int)似乎在main函数中有效,但在arrayprint函数中却没有。在数组打印函数中,它的计算结果为1,而在main中它的计算结果为5.为什么?

所以我想我想知道的是它们有何不同?为什么?

3 个答案:

答案 0 :(得分:4)

void arrayprint(int inarray[])

等同于:

void arrayprint(int *inarray)

所以你得到机器上int指针的大小。即使你的问题是关于C ++而你的函数看起来有点不同,它也归结为这个C FAQ条目。

所以,main n_array内部实际上是一个真正诚实的数组。但是当传递给函数时,它会“衰减”成指针。而且无法知道实际尺寸。您所能做的就是将额外的参数传递给您的函数。

void arrayprint(int inarray[], int len)
{
    for (int n_i = 0 ; n_i < len; n_i++)
    /* .... */

并称之为:

arrayprint(n_array, sizeof(n_array) / sizeof(n_array[0]));

当然,真正的解决方案是使用vector,因为您使用的是C ++。但我对C ++知之甚少。

答案 1 :(得分:1)

您遇到的是数组到指针转换,这是C ++继承的C语言特性。有关于此的详细C ++ - faq帖子:How do I use arrays in C++?

由于您使用的是C ++,因此可以通过引用传递数组:

template<size_t N>
void arrayprint(int (&inarray)[N])
{
    for (int n_i = 0 ; n_i < (sizeof(inarray) / sizeof(int)) ; n_i++)
        cout << inarray[n_i] << endl;
}

虽然在这种情况下,计算的大小是多余的:

template<size_t N>
void arrayprint(int (&inarray)[N])
{
    for (size_t n_i = 0 ; n_i < N ; n_i++)
        cout << inarray[n_i] << '\n';
}

并且,如前所述,如果您的目标不是专门将C数组传递给函数,而是传递容器或值序列,请考虑使用std::vector和其他容器和/或迭代器。

答案 2 :(得分:1)

main()n_array是一个数组。当您使用sizeof(n_array)时,您将获得数组的大小(以字节为单位)。确切地说,您获得的大小使得sizeof(char)等于1。在现今的大多数现代计算机上都是一个字节。

数组不是指针。但是,当您将数组传递给某个函数时,传递的是数组的第0个元素的地址。该数组降级为指针。因此,arrayprint()最好原型为void arrayprint(int* inarray)。当您sizeof(inarray)时,您无法计算n_arraymain()的大小。您正在计算指针的大小。