我尝试编写一个函数,该函数将任意长度的数组作为参数并打印出新行中的每个元素,但由于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 ++。)
答案 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);
}
执行时,它将循环遍历矢量的所有内容并打印它们。