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

C++ 如何声明与多维数组指针兼容的本地指针,c++,pointers,C++,Pointers,例如,我有一个指向多维数组的全局指针,如下所示: char ** arr[12][12][12]; 在函数中,我想声明一个局部变量,用上面的指针赋值: int func() { char **p[12][12][12] = arr; return 0; } 但是g++不允许。如何正确创建兼容指针?简单的备选方案:引用 如果您只想使用不同的名称(或传递参数)引用同一个数组,则可以考虑使用引用而不是指针: using pt = decltype(arr); pt &p =

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

char ** arr[12][12][12];
在函数中,我想声明一个局部变量,用上面的指针赋值:

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

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

简单的备选方案:引用

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

using pt = decltype(arr);
pt &p = arr; 
char s[500]; 
char *p=s; 
p[15];  s[15];   // both refer to the same element;  

具有附加指针间接寻址的备选方案

您还可以通过添加额外的间接级别来传递指针(请参见Quentin的注释):

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

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

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
}
char*******mp=新字符*****[12];

for(int i=0;i
char**arr[12][12][12];
不是指针。它是指向
char
的指针的三维数组。是的,它可以衰减…但是指向二维数组的指针…但是,您正在尝试分配数组。您的意思是
char*(*arr)[12][12]
?那将是一个指向m.d.数组的指针。@Amumu你想复制需要循环的
arr
std::array
将为你复制元素。
char**arr[12][12][12];
上面写满了“请重构我!”。如果
std::array
是可复制的,忘了我建议的四条注释!指针基本上是指一维数组"“嗯,不,它们不是。你可以很好地使用和使用一个多维数组的指针,就像任何其他指针一样。”昆廷:也许可以说C++中的多维数组只是一维数组的一个特例。@昆廷也许我用了一个混淆的措辞。我想解释的是指针运算是一维的。当然,指针指针的指针允许你拥有多维结构,但第一级间接指的是一个一维指针数组,它本身指的是一个一维指针数组……等等,直到你拥有了所有的维度。@ChristianHackl是的!谢谢!这就是我想在我的评论中说的-我就像你简短得多的公式;-)我应该引用整个句子:即使我只是误解了那个片段,你可以用指向多维数组的指针做任何你想做的事。
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
}
vector<vector<vector<char**>>> arr;