如何将指针的二维数组作为常量传递?

How to pass a two-dimensional array of pointers as const?

提问人:VincentSchaerl 提问时间:3/21/2023 最后编辑:VincentSchaerl 更新时间:3/21/2023 访问量:100

问:

如果我创建一个指针的二维数组并将其传递给一个函数:

int main()
{
    int* array[2][2];

    int a = 5;
    int b = 10;
    array[0][0] = &a;
    array[1][1] = &b;

    test(array);
}

如何定义此函数,以便以下 3 个语句都不可行?

void test(int* array[2][2])
{
    int c = 20;

    // statement 1:
    *(array[0][0]) = c;

    // statement 2:
    array[1][1] = &c;

    // statement 3:
    int* array2[2][2];
    array = array2;
}

我试过了这个:

void test(int const * const array[2][2])
{
    int c = 20;

    // statement 1:
    *(array[0][0]) = c;     // is no longer possible

    // statement 2:
    array[1][1] = &c;       // is no longer possible

    // statement 3:
    int* array2[2][2];
    array = array2;         // is still possible
}

由于 const 从右到左工作,因此第一个 const 禁止通过取消引用这些指针来更改数组指针指向的 int 值(语句 1),第二个 const 禁止更改指针本身(语句 2)。

但是我无法找到如何使数组本身保持常量,因此名为“array”的变量,在我的理解中是指向数组第一个元素的指针,不能更改为指向另一个第一个元素/数组(语句 3)。

非常感谢帮助。谢谢。

C++ 指针 多维数组 常量 参数传递

评论

4赞 463035818_is_not_an_ai 3/21/2023
std::数组
1赞 Eljay 3/21/2023
C样式数组在C++中使用它们时有一些特殊性。修复了这些特性,使 C++ 具有更一致的行为,并且行为更接近其他 C++ 对象。另一种方法是自己包装它们,这将使此类 2-dim 数组更易于作为参数和返回值处理。std::arraystd::arraystruct Array2x2{ int array[2][2]; };

答:

4赞 Mark Tolonen 3/21/2023 #1
void test(int const * const array[2][2])

衰减为:

void test(int const * const (* array)[2])

这可以是 const:

void test(int const * const (* const array)[2])