如何初始化 int *const *const.

How to initialize int *const *const?

本文关键字:const int 初始化      更新时间:2023-10-16

我需要一个具有固定宽度和高度的 2d 数组,它只能更改存储在其中的各个值。它在标头中声明,稍后在源文件中初始化。

我的发现使我尝试了以下片段;不幸的是,问题是关于1d或非常量数组的,与我的情况不匹配。

int *const *const a = new int[10][10];
int *const *const b = new int[10][10]();
int *const *const c = new int*[10];
for (int i = 0; i < 10; ++i) {
    c[i] = new int[10];
}

我的希望是在最后一个示例中,但是如果 c 的"内部"数组没有初始化并且由于它们是 const 而无法初始化它们,我如何使用它们?

此数组不需要其他类型吗?我在想int d[][]但它没有恒定的宽度和高度。
在我看来,这是一个悖论(如果它存在于 c++ 世界中),我错过了什么吗?

我在考虑int d[][]但它没有恒定的宽度和高度。

int d[][]没有意义(并且将被编译器拒绝)。就多维数组而言,只能省略第一维的大小来表示不完整的类型。其他维度的大小是类型的一部分。你不能省略它们,就像你不能省略int一样。

换句话说,如果你有类似 int d[5][10] 的东西,那么你可以把它看作是元素类型 int[10] 的一维数组。通常,将多维数组视为一维数组的特例。这将使一切更容易理解。


在 C++ 中解决问题的最佳解决方案是创建一个包含私有std::array<T, Width * Height> data;的类,并在内部int width成员变量,并计算公共成员函数中各个 x 和 y 参数的数组偏移量,例如:

T& operator()(int x, int y)
{
    return data[y * width + x];
}

如果尺寸仅在运行时已知,那么您唯一需要更改的是使用 std::vector 而不是 std::array .存储仍将是连续的。

下面是一个完整的示例:

#include <vector>
#include <iostream>
class Matrix
{
public:
    Matrix(int width, int height, int value) :
        width(width),
        data(width * height, value)
    {}
    int& operator()(int x, int y)
    {
        return data[y * width + x];
    }
private:
    int width;
    std::vector<int> data;
};
int main()
{
    Matrix m(5, 10, 123);
    std::cout << m(7, 8) << "n";
    m(7, 8) = 124;
    std::cout << m(7, 8) << "n";
}

我的希望是在最后一个示例中,但是如果 c 的"内部"数组未初始化并且由于它们是 const 而无法初始化它们,我如何使用它们?

这根本不是真的:

int * const * const c = new int*[10]
{
    new int[10], new int[10], new int[10], new int[10], new int[10],
    new int[10], new int[10], new int[10], new int[10], new int[10]
};