我的教授给了我一个问题。
表示由于数据类型而使用void指针来创建动态2D数组而不是int指针。但我不知道如何使用 - >创建void***m // data type is void* pointer
任何人都可以举一个例子吗?感谢您的回答,非常感谢!
答案 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的“向量”类。