在C ++中创建一个指向三维数组的指针

时间:2015-03-27 23:28:11

标签: c++ c arrays pointers

我看过这个similar question,但它没有用。

在外部,在Filter.h中我有

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'到二进制'运算符*'的无效操作数

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

unsigned char (*new_ptr)[8192][8192] = &(initialized_test_struct -> arr);

应该是

unsigned char new_ptr[3][8192][8192] = initialized_test_struct -> arr;

但这是非常糟糕的C ++,如果使用C ++ 11,这会更好:

auto new_ptr = initialized_test_struct -> arr;

而且我不了解您问题的具体细节,但像std::vector这样的课程可以为您提供更好的可用性并且更容易处理。

顺便说一句,数组已经是一个指针,这就是你不必使用&的原因。你可能想要创建一个指向该数组的指针(为什么?),在这种情况下使用:

auto *new_ptr = &initialized_test_struct -> arr;

unsigned char *new_ptr[3][8192][8192] = &initialized_test_struct -> arr;

assert initialized_test_struct -> arr[2][54][343] == (*new_ptr)[2][54][343]

答案 1 :(得分:1)

这应该有效:

#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。

答案 2 :(得分:0)

auto new_ptr = initialized_test_struct -> arr;

我唯一可以上班的东西。为了使其工作,我还必须添加-std = c ++ 11标志,因为它是c ++ 11的一部分