我正在尝试更多地了解数组,因为我是编程新手。所以我正在玩不同的代码部分,并试图了解三件事,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.为什么?
所以我想我想知道的是它们有何不同?为什么?
答案 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_array
中main()
的大小。您正在计算指针的大小。