簡體   English   中英

如何聲明與多維數組的指針兼容的本地指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM