如何声明与多维数组的指针兼容的本地指针

时间:2016-02-27 16:38:48

标签: c++ pointers

例如,我有一个指向多维数组的全局指针,如下所示:

char ** arr[12][12][12];

在函数中,我想声明一个局部变量,用上面的指针赋值:

int func() {
    char **p[12][12][12] = arr;
    return 0;
}

但是g ++不会允许。如何正确创建兼容指针?

1 个答案:

答案 0 :(得分:4)

简单替代方案:参考

如果你只是想使用不同的名称引用同一个数组(或传递参数),你可以考虑使用引用而不是指针:

using pt = decltype(arr);
pt &p = arr; 

Online demo here

替代附加指针间接

您还可以通过添加额外级别的间接传递指针(请参阅Quentin的评论):

pt *pp = &arr; 
cout << *(*pp)[1][2][3]<<endl; 

它的可读性较差,因为在使用索引之前必须取消引用指针。

困难的方法:指向指针的指针......

但是您将无法传递一个指针,该指针将使用您期望的语法直接访问您的数组元素(即不添加间接级别)。这仅适用于一维指针:

char s[500]; 
char *p=s; 
p[15];  s[15];   // both refer to the same element;  

要对多维数组使用相同类型的方法,必须彻底改变方法:索引指针指的是一维数组中的元素,并且编译器不知道一维数组的大小。因此,您必须使用多个连续的一维间接来进行多维索引。

因此,您将使用char*****指针。这不是那么方便,因为首先它不是那么可读,其次你必须构建一维数组的多维指针结构,而char**中的arr指针都连续存储:

char *****mp = new char****[12];
for (int i=0; i<12; i++) 
{
    mp[i] = new char***[12];
    for (int j=0; j<12; j++) 
        mp[i][j] = arr[i][j];   // attention use same array - if you'd want to clone 
                                // you'd have to allocate the last array and copy elemnts
}

Online demo

不要忘记你必须删除[]所有这些中间数组,这使得所有这些都不那么容易使用。

更好的方法

更好的方法是使用矢量:

vector<vector<vector<char**>>> arr; 

通过这种方法,您可以非常轻松地通过引用传递,或者通过复制传递向量(这对于数组是不可能的)并使用多维索引(因为每个向量都是自己的大小)。

不再存在复杂的内存管理问题。完美灵活。