在C 中创建一个不可变化的2D数组

Creating an unmodifiable 2d array in c++

本文关键字:不可变 一个 可变化 数组 2D 创建      更新时间:2023-10-16

快速背景,我在Java上有一些经验,目前是C 的新经验。

我的问题来自一个作业,我们必须创建4个不同的魔法正方与每个人不同。我的意思是,如果一个2D数组看起来像:

1 2 3
4 5 6
7 8 9

下一个将旋转90度

7 4 1
8 5 2
9 6 3

等等..

为了制作第一个矩阵,我只是制作了一个2D数组,然后使用魔术方算法(无关)

创建它
int** square = new int*[size]();
for (int i = 0; i<size; i++) {
   square[i] = new int[size]();
}
//set values to square .. irrelevant to show, could be anything
//way down the code
int** secondSquare = square;

对于第二三分之二和第四个,我要做的就是旋转上一个旋转的正方形。但是,我的问题不是我无法翻转阵列,而是在试图翻转第一个广场的值时也在改变。

显然,这更多的是能够在正方形中访问数据并在尝试将其添加到秒数时不会更改数据的问题。

我尝试将其制成,因此正方形是一个可修改的指针W常数无法解码的值。

const int** square = new int*[size];

问题是我必须将值分配给正方形,因此无法完成。同样,当我初始化秒数时,它给了我一个错误,因为它是类型Int **而不是const int **。

任何更好的方法来处理访问数据问题而不更改值并在初始化时正确设置两个数组(或对象)?

您会很好地避免使用原始指针和new。这确实应该出现在任何C 课程的高级部分中。

这是一种方法:

array< array<int,3>, 3> square = {{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }};
square[1][1] = 12;   // optional
const auto &c_square = square;

现在c_squaresquare的const登录器,您可以在以后使用,并避免修改square

问题是int** secondSquare = square;square指针的地址复制到secondSquare。因此,最后,您有两个(三个,四个)指向记忆中完全相同的位置。想一想,就像您创建了一个正方形一样,但您尝试通过四个不同的指针访问它。

您想做的是为4个不同的int **指针分配内存。

要创建一个2D数组,您将其声明为const:

const int array_2d[3][3] =
{
  0, 1, 2,
  3, 4, 5,
  6, 7, 8
};

根据我的经验,更好的方法是将其声明为static const,因此您告诉编译器只有1个仅读取实例:

static const int array_2d[3][3] =
{
  0, 1, 2,
  3, 4, 5,
  6, 7, 8
};  

static允许编译器将数据放置在可执行文件的仅读取部分中并直接访问它,而不是在使用前将其从读取到堆栈复制到堆栈(我已经看到编译器发出了此类编译器代码)。