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

Sizeof() on a C++ array works in one function, but not in the other

本文关键字:函数 不起作用 起作用 另一个 数组 Sizeof c++ 一个      更新时间:2023-10-16

我正在努力学习更多关于数组的知识,因为我是编程新手。所以我在玩代码的不同部分,并试图学习三件事,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。为什么?

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

This

void arrayprint(int inarray[])

等价于:

void arrayprint(int *inarray)

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

因此,在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 s,因为您正在使用c++。但是我对c++了解不多

您遇到的是数组到指针的转换,这是c++继承的C语言特性。关于这个问题有一篇详细的c++常见问题解答:如何在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和其他容器和/或迭代器。

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

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