例如,我有一个指向多维数组的全局指针,如下所示:
char ** arr[12][12][12];
在函数中,我想声明一个局部变量,用上面的指针赋值:
int func() {
char **p[12][12][12] = arr;
return 0;
}
但是g ++不会允许。如何正确创建兼容指针?
答案 0 :(得分:4)
简单替代方案:参考
如果你只是想使用不同的名称引用同一个数组(或传递参数),你可以考虑使用引用而不是指针:
using pt = decltype(arr);
pt &p = arr;
替代附加指针间接
您还可以通过添加额外级别的间接传递指针(请参阅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
}
不要忘记你必须删除[]所有这些中间数组,这使得所有这些都不那么容易使用。
更好的方法
更好的方法是使用矢量:
vector<vector<vector<char**>>> arr;
通过这种方法,您可以非常轻松地通过引用传递,或者通过复制传递向量(这对于数组是不可能的)并使用多维索引(因为每个向量都是自己的大小)。
不再存在复杂的内存管理问题。完美灵活。