【问题标题】:modifying 2d array in a function修改函数中的二维数组
【发布时间】:2011-07-13 19:22:42
【问题描述】:

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

【问题讨论】:

  • 相关FAQ
  • 要通过引用传递二维数组,您可以在参数列表中使用特殊语法“char**”,它表示指向其他指针的指针。

标签: c++ function multidimensional-array


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • @Mahesh:在函数参数的上下文中,数组指针,A = B确实使A指向B .
      • 刚刚检查,你是对的。对不起。将删除我的评论。谢谢。
      【解决方案4】:

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

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

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

      【讨论】:

      • 本例中的 B 是什么?字符 B[10][10] ?
      【解决方案5】:

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

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

      • 上下翻转矩阵
      • 转置

      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
      

      【讨论】:

        猜你喜欢
        • 2016-01-22
        • 2013-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-18
        • 2011-04-30
        相关资源
        最近更新 更多