修改函数中的2d数组

时间:2011-03-11 21:23:22

标签: c++ function multidimensional-array

所以我编写了一个将2D数组旋转90度的函数,我在IRC上被告知我不能通过引用传递2D数组(例如void test(char 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;
}

5 个答案:

答案 0 :(得分:3)

A = B ;不会将数组B的元素永久复制到A.永久更改为A元素的分配无效。 A在函数返回时保留原始值。您需要执行成员明智的副本,以永久性地将B的元素复制到A

答案 1 :(得分:1)

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

memcpy(A, B, sizeof(B));

答案 2 :(得分:1)

阅读@FredOverflow建议链接:How do I use arrays in C++?

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

  • 向上/向下翻转矩阵
  • 转置它

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]);
}

我已使用swap()swap_ranges()来执行操作。

实施例

// -*- 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

答案 3 :(得分:0)

数组在C ++中不像那样工作。当你在一个函数中传递一个数组时,你正在传递一个指向第一个元素的指针,所以你正在做的是创建一个本地定义的数组B,然后设置传递给你的函数的指针指向B阵列的头部。分配给原始A的内存在任何时候都不会发生变化。然后当函数返回时,函数的A指针将被丢弃,原始的A数组保持不变。如果要修改作为函数参数传递的数组,则必须直接修改元素。

答案 4 :(得分:0)

您尝试通过引用传递数组并更改该引用。这有效,但没有必要。

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

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;    
        }
}