该函数无法初始化数组,因为sizeof()
返回int pointer
的字节
不是myArray
指向的内存大小。
void assignArray(int *myArray)
{
for(int k = 0; k < sizeof(myArray); ++k)
{
myArray[k] = k;
}
}
还有其他问题吗?
谢谢
答案 0 :(得分:6)
唔不,没有其他问题。你说的问题是阻止你初始化数组的唯一因素。
通常,只需将大小与指针一起传递即可解决:
void assignArray(int* myArray, std::size_t mySize)
{
for (std::size_t k = 0; k < mySize; ++k)
myArray[k] = k;
}
请注意,我已使用std::size_t
作为大小,因为这是存储大小的标准类型(它将是8位字节的64位计算机,而int
通常不是)。
在某些情况下,如果静态知道大小,则可以使用模板:
template <std::size_t Size>
void assignArray(int (&myArray)[Size])
{
for (std::size_t k = 0; k < Size; ++k)
myArray[k] = k;
}
但是,这仅适用于数组,而不适用于已分配数组的指针。
int array1[1000];
int* array2 = new int[1000];
assignArray(array1); // works
assignArray(array2); // error
答案 1 :(得分:3)
我没有看到其他问题。但是,你可能想要这个:
template<int sz>
void assignArray(int (&myArray)[sz])
{
for(int k = 0; k < sz; ++k)
{
myArray[k] = k;
}
}
当然,除非编译器在编译时不知道它有多大。在这种情况下,您必须显式传递大小。
void assignArray(int* myArray, size_t sz)
{
for(int k = 0; k < sz; ++k)
{
myArray[k] = k;
}
}
如果你不知道尺寸,则会出现设计错误。
答案 2 :(得分:0)
您应该能够区分两种类型的阵列。一个看起来像这样:
type name[count];
此数组的类型为type[count]
,每个count
的类型不同。虽然它可以转换为type *
,但它是不同的。一个区别是sizeof(name)
为您提供count*sizeof(type)
另一种类型的数组如下所示:
type *name;
这基本上只是一个可以使用数组初始化的指针,例如malloc
或new
。此变量的类型为type *
,如您所见,该类型中没有 count 信息。因此,sizeof(name)
为您提供计算机中指针的大小,例如4或8个字节。
为什么这两个sizeof
不同,你问?因为在编译时评估sizeof
。请考虑以下代码:
int n;
cin >> n;
type *name = new type[n];
现在,当您说sizeof(name)
时,编译器无法知道n
可能的未来值。因此,它无法将sizeof(name)
计算为数组的实际大小。此外,name
指针甚至可能不指向数组!
void assignArray(int *myArray, int size)
{
for(int k = 0; k < size; ++k)
{
myArray[k] = k;
}
}