C++ 有没有一种方法可以创建一个不改变程序中argument的函数

C++ 有没有一种方法可以创建一个不改变程序中argument的函数,c++,C++,我创建了一个代码。我想在两个函数中使用相同的变量,但我不想函数将值更改为另一个函数。为了让我自己更清楚,这里有一个例子: int num1(int arr[5][6],int count); int num2(int arr[5][6],int count2); int main() { int count = 0; int count2 = 0; int arr[5][6] = { {0, 0, 0, 1, 0, 0} , {0, 0

我创建了一个代码。我想在两个函数中使用相同的变量,但我不想函数将值更改为另一个函数。为了让我自己更清楚,这里有一个例子:

int num1(int arr[5][6],int count);
int num2(int arr[5][6],int count2);
   int main()
   {
       int count = 0;
    int count2 = 0;
    int arr[5][6] = {
   {0, 0, 0, 1, 0, 0} ,   
   {0, 0, 0, 0, 0, 0} ,   
   {0, 0, 0, 0, 0, 0} ,
   {0, 0, 0, 0, 0, 0} ,
   {0, 0, 0, 0, 0, 0}
    };
    cout << num1(arr,count);
    cout << num2(arr,count2);
    return 0;
    }
int num1(int arr[5][6],int count){
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 6; j++) {
            if(arr[i][j] == 1){
            count++;
            arr[i][j] = 0;
            }
        }
    }
    return count;
}
int num2(int arr[5][6],int count2){
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 6; j++) {
            if(arr[i][j] == 1){
             count2++;
            arr[i][j] = 0;
            }

        }
    }
    return count2;
}

此代码将被打印,因为num1将arr中唯一的“1”更改为“0”,并且因为num2将获得一个所有位置都为0的数组。我想要的是两个函数都打印1,这样输出将是11而不是10。不,在不创建新数组的情况下,我真的想知道是否有一种方法可以使用单个数组来执行此操作

,因为基本上是将指向2D数组的指针传递给函数,如果不修改主函数中的数组arr,就无法修改参数arr

一种可能的解决方案是将arr作为常量传递,然后将其复制到临时数组中进行修改

int num1常量int arr[5][6],int count{ int arrLoc[5][6]; 对于int i=0;i<5;i++{ 对于int j=0;j<6;j++{ arrLoc[i][j]=arr[i][j]; 如果arrLoc[i][j]==1{ 计数++; arrLoc[i][j]=0; } } } //在保持“arr”不变的情况下对本地副本进行变异 突变RLOC; 返回计数; }
由于实际上是将指向2D数组的指针传递给函数,因此如果不修改主函数中的数组arr,就无法修改参数arr

一种可能的解决方案是将arr作为常量传递,然后将其复制到临时数组中进行修改

int num1常量int arr[5][6],int count{ int arrLoc[5][6]; 对于int i=0;i<5;i++{ 对于int j=0;j<6;j++{ arrLoc[i][j]=arr[i][j]; 如果arrLoc[i][j]==1{ 计数++; arrLoc[i][j]=0; } } } //在保持“arr”不变的情况下对本地副本进行变异 突变RLOC; 返回计数; }

C数组不支持以C++或C中的大多数其他方式来支持正确的值语义。另一种方法是std::array,它确实可以像人们所期望的那样工作。要获得6宽5高的数组,类型为std::array。由于这有点冗长,您可能需要一个using语句,例如

using arr_6_5 = std::array<std::array<int, 6>, 5>;
您可以将num1和num2的类型签名更改为


如果你想编辑原始数组,那么它是ARRY6Y5和ARR,如果你想读原件而不做拷贝,那么它是ARR66Y5 const & AR.< /P> < P> C数组不支持以C++或C中的大多数其他方式来支持正确的值语义。另一种方法是std::array,它确实可以像人们所期望的那样工作。要获得6宽5高的数组,类型为std::array。由于这有点冗长,您可能需要一个using语句,例如

using arr_6_5 = std::array<std::array<int, 6>, 5>;
您可以将num1和num2的类型签名更改为


如果您确实想编辑原始数组,那么它是arr_6_5&arr,如果您想读取原始数组而不制作副本,那么它是arr_6_5 const&arr。

您需要制作该数组的副本。可能会复制原始数组并切换到使用。这将像普通对象一样运行,并在通过值传递时进行复制。@AdrienGivry不,它不是int**arr。只有顶级数组衰减,这使它成为int*arr[6]。@R4Z7-。基本上非常简单-只需在数组周围包装一个结构,立即就有了一个可复制、可赋值的数组,可以将其传递给函数并按值返回,等等。您只需使用一个额外的数组。访问数组的语法。您将需要创建该数组的副本。可能需要删除原始数组的副本并切换到使用。这将像普通对象一样运行,并在通过值传递时进行复制。@AdrienGivry不,它不是int**arr。只有顶级数组衰减,这使它成为int*arr[6]。@R4Z7-。基本上非常简单-只需在数组周围包装一个结构,立即就有了一个可复制、可赋值的数组,可以将其传递给函数并按值返回,等等。您只需使用一个额外的数组。访问数组的语法。好的!所以我需要做的就是在函数中创建一个2D数组,然后每次2D数组=arr,然后在函数结束时对我创建的值进行变异?但是,我在main函数中调用什么呢?arr或arrLocarrLoc在主功能中不可用,因为其范围仅限于num1功能。如果您希望对原始数组进行变异,那么您在更正中的实现就可以了。您是否在询问如何将数组传递给num1函数?您不需要更改正在执行的操作,因为arr将自动成为函数中的常量指针,并且新数组仅为本地数组。但它在函数中的作用类似于arr?是的,因为您将参数命名为arr。您可以将其命名为pointer2Arr,它也将类似于主函数中指向原始arr的常量指针。@Jarod42,你说得对。我没有公关
完全读取代码。好的!所以我需要做的就是在函数中创建一个2D数组,然后每次2D数组=arr,然后在函数结束时对我创建的值进行变异?但是,我在main函数中调用什么呢?arr或arrLocarrLoc在主功能中不可用,因为其范围仅限于num1功能。如果您希望对原始数组进行变异,那么您在更正中的实现就可以了。您是否在询问如何将数组传递给num1函数?您不需要更改正在执行的操作,因为arr将自动成为函数中的常量指针,并且新数组仅为本地数组。但它在函数中的作用类似于arr?是的,因为您将参数命名为arr。您可以将其命名为pointer2Arr,它也将类似于主函数中指向原始arr的常量指针。@Jarod42,你说得对。我没有完全校对代码。不,它只需要一个数组。当我尝试执行2D数组时,它会给我一个错误。@R427我已经修复了语法。对不起!都很好,但为什么我需要2个{{这就是语法的工作原理?我如何调用它们以便它们打印返回值?@R4Z7@R4Z7 std::array arr,或者只是arr_6_5 arr,假设您有相关的using语句。不,它只需要一个数组,当我尝试执行2D数组时,它会给我一个错误。@R427我已经修复了语法。很抱歉!很好,但是为什么我需要它呢2{{这就是语法的工作原理?我如何调用它们以便它们打印返回值?@R4Z7@R4Z7 std::array arr,或者假设您有相关的using语句,则只调用arr_6_5 arr。
int num1(arr_6_5 arr, int count);
int num2(arr_6_5 arr, int count);