C++ 修改函数中的二维数组

C++ 修改函数中的二维数组,c++,function,multidimensional-array,C++,Function,Multidimensional Array,因此,我编写了一个函数,可以将2D数组旋转90度,并且在IRC上有人告诉我,我不能通过引用传递2D数组,例如void testchar a[][10]&我应该按照通常的方式传递数组,但是当我这样做时,这个函数不会改变实际数组。那么如何修改函数中的原始数组呢 void one(char A[][10], int N) { char B [10][10]; for (int i = 0; i < N; i++) for (int j = 0; j < N;

因此,我编写了一个函数,可以将2D数组旋转90度,并且在IRC上有人告诉我,我不能通过引用传递2D数组,例如void testchar a[][10]&我应该按照通常的方式传递数组,但是当我这样做时,这个函数不会改变实际数组。那么如何修改函数中的原始数组呢

void one(char A[][10], int N)
{
    char B [10][10];
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            B[j][N-i-1] = A[i][j];
    A = B;
}

A=B;不会将数组B的元素永久复制到A。永久更改为的元素是无效的赋值。A在函数返回时保留其原始值。您需要执行成员级复制,以将B的元素永久复制到a。

a=B;不会将数组B的元素永久复制到A。永久更改为的元素是无效的赋值。A在函数返回时保留其原始值。你需要做一个成员智能拷贝来永久复制B元素到.< /p> 数组在C++中不工作。当您在函数中传递数组时,您传递的是指向第一个元素的指针,仅此而已,因此您要做的是创建一个本地定义的数组B,然后将传递到函数中的指针设置为指向B数组的头。分配给原始用户的内存在任何时候都不会发生实际变化。然后,当函数返回时,函数中的A指针将被丢弃,原始A数组将保持不变。如果你想修改一个数组作为参数传递给函数,你必须直接修改元素。

数组在C++中不工作。当您在函数中传递数组时,您传递的是指向第一个元素的指针,仅此而已,因此您要做的是创建一个本地定义的数组B,然后将传递到函数中的指针设置为指向B数组的头。分配给原始用户的内存在任何时候都不会发生实际变化。然后,当函数返回时,函数中的A指针将被丢弃,原始A数组将保持不变。如果要修改作为参数传递给函数的数组,则必须直接修改元素。

当传递诸如char a[][10]之类的数组时,实际上传递的是指向原始数组的指针,因此执行a=B将指向B,并且不会更改原始数组。相反,您可以使用诸如memcpy之类的函数将B的内容实际复制到a:


当您传递诸如char A[][10]之类的数组时,实际上是在传递一个指向原始数组的指针,因此执行A=B会指向B,并且不会更改原始数组。相反,您可以使用诸如memcpy之类的函数将B的内容实际复制到a:


您试图通过引用传递数组并更改该引用的内容。这是可行的,但不是必需的

可以逐个元素直接修改数组:

void one(char A[][10], int N)
{
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
        {
            char b = A[j][N-i-1];
            A[j][N-i-1] = A[i][j];
            A[i][j] = b;    
        }
}

您试图通过引用传递数组并更改该引用的内容。这是可行的,但不是必需的

可以逐个元素直接修改数组:

void one(char A[][10], int N)
{
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
        {
            char b = A[j][N-i-1];
            A[j][N-i-1] = A[i][j];
            A[i][j] = b;    
        }
}

阅读@fredfolflow链接建议的内容:

要按时钟旋转90°NxN阵列,您可以将任务分为两个较小的步骤:

向上/向下翻转矩阵 换位 输出
阅读@fredfolflow链接建议的内容:

要按时钟旋转90°NxN阵列,您可以将任务分为两个较小的步骤:

向上/向下翻转矩阵 换位 输出
在这个例子中B是什么?字符B[10][10]?在这个例子中B是什么?char B[10][10]?与通过引用传递2d数组相关,在参数列表中使用特殊语法char**表示指向其他指针的指针。与通过引用传递2d数组相关,在参数列表中使用特殊语法char**,它表示指向其他指针的指针。@Mahesh:在函数参数的上下文中,数组是指针,a=B确实指向B。刚才选中,您是正确的。很抱歉将删除我的评论。谢谢。@Mahesh:在函数参数的上下文中,数组是指针,A=B确实指向B。刚才检查过,您是正确的。很抱歉将删除我的评论。谢谢
void rot90cw(char A[][N]) {
  // flip in up/down direction (swap rows)
  for (int i = 0; i < N/2; i++)
    std::swap_ranges(&A[i][0], &A[i][0] + N, &A[N-i-1][0]);

  // transpose (swap top-right and bottom-left triangles)
  for (int i = 0; i < N-1; i++)
    for (int j = i+1; j < N; j++)
      std::swap(A[i][j], A[j][i]);
}
// -*- coding: utf-8 -*-
#include <algorithm>
#include <iostream>

namespace {
  const int N = 3;

  // rotate 90° clock-wise
  void rot90cw(char A[][N]) {
      // ... defined above
  }

  void print(char a[][N]) {
    for (int i = 0; i < N; i++) {
      for (int j = 0; j < N; j++)
        std::cout << a[i][j];
      std::cout << '\n';
    }
    std::cout << std::endl;
  }
}

int main() {
  char a[][N] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' };
  print(a);
  rot90cw(a);
  std::cout << "Rotated 90° clock-wise:" << std::endl; //note: utf-8
  print(a);
}
abc
def
ghi

Rotated 90° clock-wise:
gda
heb
ifc