我被我的教授給了一個問題。由於數據類型的原因,使用void指針創建動態2D數組而非int指針更爲一般。如何使用void指針在C++中創建二維數組?
但我不知道如何使用創建 - >void***m // data type is void* pointer
任何人都可以給出這樣的例子?感謝您的回答,非常感謝!
我被我的教授給了一個問題。由於數據類型的原因,使用void指針創建動態2D數組而非int指針更爲一般。如何使用void指針在C++中創建二維數組?
但我不知道如何使用創建 - >void***m // data type is void* pointer
任何人都可以給出這樣的例子?感謝您的回答,非常感謝!
如果我不得不這樣做的,我會採取的方法是使用分配
new unsigned char[<max size in bytes>]
然後我會創建一個模板類訪問數組的內存。例如:
template<class ElementType, int numBytes>
class DynamicArray
{
public:
DynamicArray(unsigned char* buffer);
ElementType& Get(long index);
void Set(long index, const ElementType &element);
private:
ElementType* m_array;
};
在您的getter/setter方法的模板化實現中,您只需訪問m_array。你可以通過乘以sizeof(ElementType)來檢查索引是否有效,然後驗證它是否小於numBytes。
構造函數將簡單地將緩衝區轉換爲ElementType *並將其分配給m_array;
然後,您可以使用字節分配數組,然後以不同的格式正是如此訪問:
unsigned char* buffer = new unsigned char(1000);
DynamicArray<long, 1000> longArray(buffer);
long val = 10;
longArray.Set(0, val);
longArray.Get(0);
DynamicArray<short, 1000> shortArray(buffer);
short firstTwoBytes = shortArray.Get(0);
etc.
我會做這種方式的原因是,它給你最大的編譯時類型安全。這是C++模板非常擅長的一件事。您可以使用與上述代碼演示的模板類的多個實例相同的緩衝區。我沒有嘗試編譯這個,所以我很抱歉,如果有任何語法錯誤。
順便說一句,你可以使用操作符重載使數組訪問器看起來像是一個'C'數組。以STL的「矢量」類爲例。
太棒了!謝謝你的解釋! – zhen
數組引用非常簡單。可以說B是數組的基地址(起始地址),S是一個元素的大小,I0是一個數組的索引。
在一個維數組的情況下,元素的地址是:
B + (S * I0)
可以將此擴展到多個維度,但是現在你需要知道數組的其他方面。比方說你有一個尺寸D1,D0二維數組和索引I0,I1元素的地址是:
B + (D1 * I1 * S) + (S * I0)
三維陣列將
B + (D2 * I2) * (D1 * I1 * S) + (S * I0)
等。
在你的空指針的情況下,爲int的二維數組:
int D1 = 10, D0 = 20, I1 = 5, I0 = 5;
void * base;
base = malloc((D1 * D0) * sizeof(int));
int value = *((char*)base + (D1 * I1 * sizeof(int)) + (sizeof(int) * I0));
注意,我不得不投的空指針爲char *,使指針運算將在的sizeof()來完成單位。儘管這可能是一般性的,但我不認爲我會多用它;-)但它確實有助於理解數組索引是如何工作的。
告訴你的教授,直接使用內聯asm和訪問索引寄存器比使用void指針訪問數組要普遍得多。 –
你能舉個例子嗎?一段我可以編譯的代碼。謝謝! – zhen
這和你以前的問題有什麼不同? http://stackoverflow.com/questions/2212506/how-do-you-use-a-void-pointer-to-generate-2d-dynamic-array – interjay