我看过这个,但它不起作用。
外部,在过滤器里。我有

struct test{
    unsigned char arr[3][8192][8192];
}

我已经初始化了其中一个结构,如果使用以下方法,我的代码可以正常工作:
initialized_test_struct -> arr[2][54][343]

但是,我要缓存指向此数组的指针:
unsigned char (*new_ptr)[8192][8192] = &(initialized_test_struct -> arr)
assert initialized_test_struct -> arr[2][54][343] == new_ptr[2][54][343]

但是当我尝试这个的时候,我得到:
在初始化过程中,无法将“unsigned char()[3][8192][8192]”转换为“unsigned char()[8192][8192]”
当我尝试:
unsigned char (*colors)[3][8192][8192] = &(input -> color);

我得到错误的数据类型(使用时):
错误:“unsigned char[8192]”和“char”到二进制“operator*”类型的操作数无效
我该怎么办?

最佳答案

这应该有效:

#include <iostream>

struct test{
    unsigned char arr[3][8192][8192];
};

int main()
{
    test initialized_test_struct;
    unsigned char (*new_ptr)[8192][8192] = initialized_test_struct.arr;
    return 0;
}

无论何时在表达式中使用数组变量,它都会转换为指向数组元素类型的指针。例如,
int a[3] = {1,2,3};
int* b = a; // this is ok

但是,如果我们这样做了
int a[2][1] = {{1}, {2}};
int* b = a; // this will fail, rhs has type int(*)[1], not int*

我们必须这么做
int a[2][1] = {{1}, {2}};
int (*b)[1] = a; // OK!

如果你有一个C++ 11兼容编译器,你可以简单地做
auto new_ptr =  initialized_test_struct.arr;

编译器为您处理类型推断,并用正确的类型替换auto。

09-28 03:25