如何使用void指针在C ++中创建2D数组?

时间:2010-02-07 13:29:43

标签: c++

我的教授给了我一个问题。

表示由于数据类型而使用void指针来创建动态2D数组而不是int指针。

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

任何人都可以举一个例子吗?感谢您的回答,非常感谢!

2 个答案:

答案 0 :(得分: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)

等等。

对于void指针,对于二维数组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));

请注意,我必须将void指针强制转换为char *,以便在sizeof()单位中完成指针运算。

即使这可能是一般性的,但我认为我不会使用它;-)但它确实有助于理解数组索引的工作原理。

答案 1 :(得分: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的“向量”类。