初始化由指针传递的数组

时间:2011-10-17 22:56:39

标签: c++ arrays function pointers initialization

该函数无法初始化数组,因为sizeof()返回int pointer的字节 不是myArray指向的内存大小。

 void assignArray(int *myArray)
 {
     for(int k = 0; k < sizeof(myArray); ++k)
     {
         myArray[k] = k;
     }
 }

还有其他问题吗?

谢谢

3 个答案:

答案 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;
    }
}

如果不知道尺寸,则会出现设计错误。

http://codepad.org/Sj2D6uWz

答案 2 :(得分:0)

您应该能够区分两种类型的阵列。一个看起来像这样:

type name[count];

此数组的类型为type[count],每个count的类型不同。虽然它可以转换为type *,但它是不同的。一个区别是sizeof(name)为您提供count*sizeof(type)

另一种类型的数组如下所示:

type *name;

这基本上只是一个可以使用数组初始化的指针,例如mallocnew。此变量的类型为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;
    }
}