[英]How to declare a local pointer that is compatible with pointer of multi-dimensional array
例如,我有一個指向多維數組的全局指針,如下所示:
char ** arr[12][12][12];
在一個函數中,我想聲明一個局部變量,用上述指針分配:
int func() {
char **p[12][12][12] = arr;
return 0;
}
但是g ++不允許。 如何正確創建兼容的指針?
簡便的選擇:參考
如果只想使用不同的名稱(或傳遞參數)來引用同一數組,則可以考慮使用引用而不是指針:
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*****
指針。 這不是那么方便,因為首先它不是那么可讀,其次您必須構建一維數組的多維指針結構,而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
}
別忘了您必須刪除[]所有這些中間數組,這使得所有這些都不是那么容易使用。
更好的方法
更好的方法是使用向量:
vector<vector<vector<char**>>> arr;
巨大的優勢在於,使用這種方法,您可以非常容易地按引用傳遞或按副本傳遞向量(這對於數組而言是不可能的),並使用多維索引(因為每個向量都具有自己的大小)。
不再有復雜的內存管理問題。 完美的靈活性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.