在C 中创建一个不可变化的2D数组
Creating an unmodifiable 2d array in c++
快速背景,我在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_square
是square
的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
允许编译器将数据放置在可执行文件的仅读取部分中并直接访问它,而不是在使用前将其从读取到堆栈复制到堆栈(我已经看到编译器发出了此类编译器代码)。
- 正在寻找C++不可变的hashset/hashmap
- 不计算一个范围内的完美数
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- 具有常量属性的不可变类
- 选择一个元素而不是一个对象的数组的原因
- 插件:TypeError:addons.function() 不是一个函数
- 如果我们不创建一个新节点并使用指针插入数据并建立链接(在链表中)怎么办?
- 为什么将函数传递给内核会导致数据变得不可变?
- 现代c++编译器会优化不可变的临时变量吗
- 只要我不包含一个标题,重新定义C++关键字合法吗
- C++中的不可变列表
- 你怎么编码,如果x不等于一个数字,程序就会退出
- 如何将地图作为不可变地图传递?
- 不可变的全局对象应该声明为"const my_result_t BLAH"还是"extern const my_result_t BLAH;"?
- C++,当函子不是一个选项时,我如何编写带有自定义函数调用的模板化 RAII 包装器?
- 向不可变纹理存储提供数据
- 如何让这个C++代码从用户那里读取五个整数而不是一个整数?
- 在C++中创建不可变且高效的类的惯用方法
- std::shared_ptr<std::string const> 可以作为引用计数的不可变字符串的有效实现吗?
- 编写接受可变跨度作为不可变跨度的模板函数