void func(int* array)
{
    array=new int[5];
    for (int i=5; i>0; i--)
        array[5-i]=i;
}
int main()
{
    int array[5]= {1,2,3,4,5};
    func(array);
    cout<<array[1]<<endl;
}


我认为这与数组是常量指针有关。 c ++如何精确地处理此代码,以及在函数内分配的动态内存会如何处理?

最佳答案

当您通过值将数组作为参数传递给函数时,它会衰减到指向第一个元素的指针,然后将其按值传递。因此,您在函数func中收到的是数组第一个元素的地址的副本。在函数中,您只需更改地址,而不会更改main()函数中的数组。对array中的func()所做的任何操作仅在该函数中是本地的。就像这样:

void f(int x)
{
     x= 100; //modifying the copy, not the variable in main()
}
int main()
{
     int value = 1000;
     f(x); //pass by value, means pass a copy!
}


在这种情况下,您要在x中更改f()的值。同样,在您的情况下,您要更改array的值。由于array是指针,因此您可以通过为其分配新的内存来使其指向其他位置。每次更改都针对该功能。

还要注意,由于您为变量array分配了内存,并且没有取消分配内存,因此程序会泄漏内存。为了避免这种情况,您必须编写:

 delete [] array;


从函数返回之前。同样,此delete不会更改array中的main()

顺便说一句,如果要更改main()中数组的元素,则应改为:

void func(int* array)
{
    //array=new int[5]; //just comment this
    for (int i=5; i>0; i--)
        array[5-i]=i; //now array points to the same memory
                      //where main()'s array is in the memory.
}


希望能有所帮助。

10-05 21:08
查看更多