如何使用void指针生成2D动态数组?

zhe*_*hen 0 c++

有谁知道如何使用void指针生成2D数组而不是int指针?

对于整数指针,我这样做:

int **m;

m = new int* [row];     
for(int i=0; i< row; i++)     
        m[i] = new int[col];

for (int i = 0; i < row; i++)
       for (int j = 0; j < col; j++)
             m[i][j] = rand () % 10;
Run Code Online (Sandbox Code Playgroud)

如果指针类型为void***m怎么办?

我怎样才能像int那样定义存储?例如.(m = new int*[row];)

谢谢你的帮助.


请允许我更明确地指出我的问题,我给出了这些:

class Matrix
{
   public:
           Matrix();
           Matrix(int,int);

           void printMatrix();

   private:
           int row;
           int col;
           void***m;
           void initMatrix();      // Initialize the storage for row and column
           void generateMatrix (); // construct a 2D array
}
Run Code Online (Sandbox Code Playgroud)

sta*_*ica 6

你的问题最好通过对什么void方法的解释来解答.

void基本上表示没有类型.因此,您无法告诉编译器创建类型的对象void,例如使用以下语句:

  • new void
  • new void[...]

这些表达式的含义大致如下:"创建一些东西"或"分别创建一些东西".对于编译器来说,这显然不够准确.

void*(但指针void)是允许的,因为指针从根本上说与编译器完全相同:另一个对象的内存地址.您可以将指针视为指向某种东西的某种箭头.如果您正在使用指针,编译器会看到该箭头,而不是它指向的实际内容.因此编译器不关心"目标类型" void.

然而,这样做的结果是你不能取消引用void*(指向void),因为这样你就可以使编译器有效地查看指向的东西,这将是一个void值,这对编译器没有任何意义.

摘要:

1)无法创建类型数组void,如new void[...].

2)可以创建指向void(void*)的指针,甚至是指向void*(void**)指针的指针.

3)可以不取消引用void*指针(但你可以取消引用void**指针).

结论:

4)可以创建一个int*数组并让它void*引用它:

int** m;
// ... (create the dangling array as in the OP's code and let m point to it)
void* v = (void*)m;
Run Code Online (Sandbox Code Playgroud)

(请参阅以下评论,了解为何void*使用此处而不是void**!)

5)由于语句#3,所有你可以合理地使用这样的指针传递它,但你无法处理数组的实际内容.为此,您需要将其强制转换为正确的数据类型:

int **m2 = (int**)v;
Run Code Online (Sandbox Code Playgroud)