如何将数组设置为新数组?

时间:2017-03-01 05:27:46

标签: c++ arrays

我需要实现一个修改数组的函数。新阵列可以是不同的大小。 cout打印1.我理解这段代码的错误,但我无法弄清楚语法是什么。

//tried this..
int reduce(int *array[])
{
    *array = new int[1];
    (*array)[0] = 6;
    return 0;
}

//also tried this..
int reduce(int array[])
{
    array = new int [1];
    array[0] = 6;
    return 0;
}    

int main()
{
    int a[1] = {1};
    int *p = a;

    reduce(&p);
    cout << a[0];

    return 0;
}

5 个答案:

答案 0 :(得分:0)

修改:

你想修改数组a,试试这个:

int reduce(int **array)
{
    *array = new int[1];
    (*array)[0] = 6;
    return 0;
}


int main()
{
    int *a = new int[1];
    reduce(&a);
    cout << a[0];

    return 0;
}

答案 1 :(得分:0)

无法正确理解您的问题,但您可以这样做:

void reduce(int *a, int size)
{
    for (int i =0; i < size; ++i) {
        *(a+i) = 6; // or whatever value to want to
    }
}

这样称呼:

int main(){
    int a[5] = {1, 1, 1, 1, 1};
    int *p = a;

    reduce(p, 5);
    for (int i =0; i < 5; ++i) { cout << a[i]<<endl; }
    return 0;
}

修改

你想做的事情可以用这种方式模糊地完成:

int * reduce (int **b, int size) {
    *b = new int[size];
    for (int i =0; i < size; ++i) {
        *(*b + i) = 6;
    }
    return *b;
}


int main(){
    int a[5] = {1, 1, 1, 1, 1};
    int *p = a;

    p = reduce(&p, 5);
    cout << p[0];
    cout << p[1];
    cout << p[2];
    cout << p[3];
    cout << p[4];

    delete [] p;

    return 0;
}

但它仍然不会改变a指向的位置。

答案 2 :(得分:0)

使用静态定义的数组无法实现您的目的。

使用类似

的数组时
int a[1] = {1};

您无法在运行时更改数组的大小,您无法使其指向动态分配的内存。您只能访问和修改数组中的元素。就是这样。

函数reduce会更改p指向的位置,但不会更改a的元素。

如果要修改a的内容,只需使用a作为参数,然后设置值。

答案 3 :(得分:0)

首先,形式参数int* array[]实际上与int** array相同(您可以将其视为二维数组)。这可能不是你想要的。

@everettjf的答案只有在更改数组大小时才有效。一个可能的解决方案(完全取代数组)将是

#include <iostream>
void print_array(int[],int);

int* reduce(int array[]) {
    // get rid of the old array
    delete[] array;

    // create a new one
    array = new int[7]{8,4,6,19,3,56,23};

    // need to return the new address, so that
    // the main function is informed on the new
    // address
    return array;
}

int main() {
    // initialize array
    int *a = new int[1]{4};

    print_array(a,1);

    // "change" array by completely replacing it
    a=reduce(a);

    print_array(a,7);

    return 0;
}

// simply prints out the array; no error checking!
void print_array(int array[], int length) {
    std::cout << "[";
    for (int i = 0; i < length ; ++i) {
        std::cout << array[i] << " ";
    }
    std::cout << "]" << std::endl;
}

reduce函数中,初始数组被完全删除。之后,您可以创建一个新的(我选择使用7个随机数)。将该指针返回给调用者(main方法)非常重要。否则,main方法中的a指针将指向无效

如果你没有强迫(例如通过某种练习)使用数组,你应该研究http://en.cppreference.com/w/cpp/container/vector

答案 4 :(得分:0)

您的问题的前提是无效的。在标准C ++中通过任何方式定义后,无法调整自动存储持续时间数组(a中的main())。

reduce()个功能中的动态内存分配不会导致a中的main()调整大小。

reduce(&p)将调用reduce()的第一个版本,然后更改p(因此它指向动态分配的内存),但不会影响a

如果main()调用reduce(a)reduce(p)(两者相同,则初始化int *p = a)将同时更改ap ,但反而导致内存泄漏。

我怀疑,潜在的问题是你错误地认为 - 指针和数组是一回事。它们实际上是不同的东西,但可以在各种环境中以相同的方式使用。而且你的代码是不能互换使用的上下文之一。

如果你想要一个可调整大小的数组,请使用静态容器(如std::vector<int>)和 - 如果你想要一个函数来调整它的大小,可以通过引用传递它。它动态管理自己的内存,因此能够动态调整自身大小。