无法找到一种方法将数组中的元素数存储在函数内的int变量中

时间:2014-03-11 18:05:23

标签: c++ arrays

我尝试编写一个函数,该函数将任意长度的数组作为参数并打印出新行中的每个元素,但由于sizeof()以字节为单位返回其大小,我尝试将数组的大小由单个元素的大小决定。当我尝试运行程序传递一个包含9个元素的数组时,它只打印出前两个。

功能:

void PrintArray(int anArray[])
{
    using namespace std;

    int nElements = sizeof(anArray) / sizeof(anArray[0]);
    for (int nIndex=0; nIndex < nElements; nIndex++)
        cout << anArray[nIndex] << endl;
}

为了找出问题所在,我注释掉了循环并添加了语句

cout << sizeof(anArray) << " " << sizeof(anArray[0]) << endl;

并打印出8 4。如何将9个元素的数组长度为8个字节?当它作为参数传递时会发生什么事情?

(另外,我也不知道矢量是如何工作的。我在3天前开始使用C ++。)

5 个答案:

答案 0 :(得分:2)

您可以依靠sizeof在声明范围内为您提供数组的大小,

例如:

void func()
{
    int array[10];
    int size = sizeof(array); // size = sizeof(int) * 10
    // The size of 'int' depends on your compiler
}

void func(int array[10])
{
    int size = sizeof(array); // size = sizeof(int*)
    // The size of 'int*' is the same as the size of any other type of pointer
    // It is typically 4 bytes on a 32-bit system and 8 bytes on a 64-bit system
}

为了计算给定数组中的项目数(再次,声明范围内),请使用:

int numOfItems = sizeof(array)/sizeof(*array);

答案 1 :(得分:0)

在C和C ++中,数组不作为函数参数存在,它们被转换为指针;你怎么声明它并不重要。请改用std :: vector。

你得到的结果的原因是你得到一个指针的sizeof(),无论指向什么类型,它总是会返回本机字大小(32位机器为4,64位为8)。

答案 2 :(得分:0)

anArray是一个指针,指针是系统上的8个字节。 int是您系统上的4个字节。

在这种情况下,您无法确定数组的长度;如果需要,您将需要呼叫者(一直到线)将其传递给您。更好的是 - 使用C ++容器(矢量等)

唯一的时间sizeof()将以您期望的方式工作,如果变量的本地定义指示数组大小。

答案 3 :(得分:0)

当数组作为函数的参数传递时,它会被隐式转换为指向其第一个元素的指针。

所以这些声明是等价的

void PrintArray( int anArray[] );
void PrintArray( int *anArray );

位于函数参数anArray的主体内部,是一个类型为int *的局部变量。指针不具有指向单独对象或某个序列对象的信息。

在函数体操作符

sizeof(anArray)

将返回类型为int *的对象的大小,该对象的平台等于8。

通常这些函数被声明为有两个参数:指向数组第一个元素的指针和数组的大小

void PrintArray( const int anArray[], int n )
{
    using namespace std;

    for ( int i = 0; i < n; i++ )
        cout << anArray[i] << endl;
}

答案 4 :(得分:0)

在这种情况下使用向量是更好的做法,除非您需要使用数组的某些特定原因。例如,如果您有一个整数向量,则以下内容将起作用:

#include <iostream>
#include <vector>

using namespace std;

void PrintVector(vector<int>& aVector)
{
  for (auto i : aVector)
    cout << i << endl;
}

int main (int argc, char* argv[])
{
  vector<int> v = {1, 37, 898, 463, 32, 2, 5};
  PrintVector(v);
}

执行时,它将循环遍历矢量的所有内容并打印它们。