2010-02-07 96 views
1

我被我的教授給了一個問題。由於數據類型的原因,使用void指針創建動態2D數組而非int指針更爲一般。如何使用void指針在C++中創建二維數組?

但我不知道如何使用創建 - >void***m // data type is void* pointer

任何人都可以給出這樣的例子?感謝您的回答,非常感謝!

+0

告訴你的教授,直接使用內聯asm和訪問索引寄存器比使用void指針訪問數組要普遍得多。 –

+0

你能舉個例子嗎?一段我可以編譯的代碼。謝謝! – zhen

+0

這和你以前的問題有什麼不同? http://stackoverflow.com/questions/2212506/how-do-you-use-a-void-pointer-to-generate-2d-dynamic-array – interjay

回答

0

如果我不得不這樣做的,我會採取的方法是使用分配

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的「矢量」類爲例。

+0

太棒了!謝謝你的解釋! – zhen

2

數組引用非常簡單。可以說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()來完成單位。儘管這可能是一般性的,但我不認爲我會多用它;-)但它確實有助於理解數組索引是如何工作的。