【问题标题】:Sizeof() on a C++ array works in one function, but not in the otherC++ 数组上的 Sizeof() 在一个函数中起作用,但在另一个函数中不起作用
【发布时间】:2011-07-11 21:54:36
【问题描述】:

由于我是编程新手,因此我正在尝试了解有关数组的更多信息。所以我在玩代码的不同部分,并试图了解三件事,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 函数中无效。在数组 print 函数中,它的计算结果为 1,而在 main 中,它的计算结果为 5。为什么?

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

【问题讨论】:

标签: c++ arrays sizeof


【解决方案1】:

这个

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]));

当然,真正的解决方案是使用vectors,因为您使用的是C++。但我对 C++ 了解不多。

【讨论】:

  • 我可以做些什么来使这项工作按我的意愿工作吗?谢谢!
  • 好的,很好的解释!!谢谢!虽然我不得不声明额外的变量。
  • @Samuraisoulification 明白这一点很好;最好使用合适的容器。
  • 正确的容器和向量是什么意思?这些是更高级的主题吗?
【解决方案2】:

您遇到的是数组到指针的转换,这是 C++ 继承的 C 语言特性。有一个详细的 C++ 常见问题解答帖子: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;
}

虽然在这种情况下 sizeof 计算是多余的:

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 和其他容器和/或迭代器。

【讨论】:

【解决方案3】:

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

数组不是指针。 但是,当您将数组传递给某个函数时,传递的是数组第零个元素的地址。数组降级为指针。所以你的arrayprint() 最好原型为void arrayprint(int* inarray)。当您使用sizeof(inarray) 时,您不会计算main()n_array 的大小。您正在计算指针的大小。

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多