将数组传递给函数没有这样就不会改变原始数组

时间:2017-07-03 04:46:17

标签: c++ arrays function

我有一个函数可以对我传递的数组执行一些魔术。但原始阵列应该完好无损。不幸的是,它正在根据阵列中发生的事情改变其内容。

请帮帮我吗?

功能:

void test(int* array) {
    array[0] = 1; // EDIT: Added missing line
    std::cout << "Inside: " << array[0] << endl;
}

int main() {
    int *testArray = new int[1];
    testArray[0] = 0;
    std::cout<<testArray[0]<<endl;
    test(testArray);
    std::cout << "Outside: " << testArray[0] << endl;
}

目前的结果是:

  

0

     

内部:1

     

外面:1

结果我想要:

  

0

     

内部:1

     

外面:0

这可能吗?

3 个答案:

答案 0 :(得分:3)

听起来你想通过值而不是通过引用传递数组。您正在将指针传递给第一个元素。因此,您对该函数内的该数组执行的任何更改都将反映到原始数组中。

另一个问题是您没有发布有关您要解决的问题的大量代码。我假设你想要这样的功能。

查看实时演示here

#include <iostream>
void test(const int*  array) {
    array[0]=1; 
    std::cout << "Inside: " << array[0] << std::endl;
}

int main() {
    int *testArray = new int[1];
    testArray[0] = 0;
    std::cout<<testArray[0]<<std::endl;
    test(testArray);
    std::cout << "Outside: " << testArray[0] << std::endl;
    delete[] testArray;
}

编译器会给您以下错误:

Error(s):
source_file.cpp:4:13: error: read-only variable is not assignable
    array[0]=1;
    ~~~~~~~~^
1 error generated.

您不应该使用new[]在C ++中分配动态数组。 99%的时间你应该使用std::vector如果你想在C ++中使用动态数组。

答案 1 :(得分:2)

避免使用C兼容性功能......

void test( std::array<int, 1> a )
{
    a[0] = 1; // fine
    std::cout << "Inside: " << a[0] << endl;
};

int main()
{
    std::array<int, 1> testArray;
    testArray[0] = 0;
    std::cout<<testArray[0]<<endl;
    test(testArray);
    std::cout << "Outside: " << testArray[0] << endl;
}

如果您需要在运行时确定的尺寸,请使用std::vector代替std::array

答案 2 :(得分:-2)

编辑:正如其他人所指出的那样,您似乎想要通过值而不是通过引用传递数组,从而复制数组的元素和仅修改副本,或者您希望避免完全修改数组的任何部分。我将详细阐述这两个部分:

在C ++中,数组和指针之间几乎没有区别。请注意,变量testArray和参数array都是指向数组开头的指针。如果您使用array修改基础数组的任何部分,那么您实际执行的操作是修改testArray array所描述的内存。如果您根本不想修改数组的任何部分,那么使用const限定符会很有帮助,正如Destructor已经在他的回答中写的那样。但是,如果您想保留原始数组但仍希望在函数内部进行一些修改,则以下内容仍适用:

为了防止数组被修改,唯一可行的方法是通过创建一个相同大小的新数组来复制它的所有元素,将所有元素从输入数组复制到副本然后只在复制,应在函数完成后删除。

我的回答:
我建议您研究一些C ++的数据结构,尤其是std::vector。如果你通过值(而不是引用)传递它,vector会处理我刚刚描述的所有必要的复制操作,并且在所有情况下,你可以像数组一样使用它,同时它提供了许多额外的功能(即动态大小,删除和插入元素,简化迭代,......)。