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

时间:2010-02-06 08:20:36

标签: 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;

如果指针类型为空,该怎么办?***?

如何像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
}

6 个答案:

答案 0 :(得分:6)

void的含义的解释可能最好地回答了您的问题。

void基本上表示没有类型。因此,您无法告诉编译器创建类型为void的对象,例如以下陈述:

  • new void
  • new void[...]

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

然而,

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

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

<强>摘要

1)无法创建void类型的数组,如new void[...]中所示。

2)可以创建指向voidvoid*)的指针,甚至是指向{{1}的指针的指针}(void*)。

3)无法取消引用void**指针(但您可以取消引用void*指针)。

<强>结论

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

void*

(请参阅下面的评论,了解为何使用int** m; // ... (create the dangling array as in the OP's code and let m point to it) void* v = (void*)m; 代替void*!)

5)由于声明#3,您可以合理地使用这样的指针进行传递,但无法处理数组的实际内容。为此,您需要将其类型转换回正确的数据类型:

void**

答案 1 :(得分:1)

使用您在另一个答案的评论中发布的代码段,可以更轻松地为您提供帮助。

class Matrix {
    private:
    int row;
    int col;
    void** m;
}

初始化表行的代码可能是这样的:

m = malloc(sizeof(int*) * row);

希望你可以用它来自己解决余下的功课。

答案 2 :(得分:1)

void *是指向某些未指定类型的指针。当然,在一般的情况下,指针与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;

void ***v = (void ***)m; // v is a 2-d array of void* pointers now!

当然,我不确定为什么你想要一个Matrix类的void ***数组。也许是自定义数值数据类型?

答案 3 :(得分:0)

你做不到。如果您负责创建数组,则需要知道元素的大小。使用void *,您不知道它指向的内容。您必须让调用者为您提供大小参数或其他内容。

编辑:也许第三个*是关键:他是否要求你创建一个void *的二维数组?毕竟,void *类型与int一样多。在您说new int[col]的地方,您应该可以说new void * [col]。你没有向我展示足够的代码来真正了解你的工作方式,但是如果它与int**一起工作,那么它几乎可以通过搜索来与void***一起工作 - 并在int =&gt;上替换void *

答案 4 :(得分:0)

由于每个指针类型都可以隐式转换为void*,因此您可以像对int*那样进行操作,并将其分配给void*

问题出在哪里?我错过了什么吗?

答案 5 :(得分:0)

我能想到的最接近的答案是以下答案。您可以创建一个2D数组作为整数的向量,然后将其转换为void *。这与存储在内存中的方式非常相似。

const unsigned int MaxRow = 10;
const unsigned int MaxColumn = 10;

void print(void * m)
{
    int * matrix = (int *) m;

    for(unsigned int i = 0; i < MaxRow; ++i) {
        for(unsigned int j = 0; j < MaxColumn; ++j) {
            std::printf( "%03d ", matrix[ ( i * MaxColumn ) + j ] );
        }

        std::printf( "\n" );
    }
}

int main()
{
    // Create
    int * matrix = new int[ MaxRow * MaxColumn ];

    for(unsigned int i = 0; i < MaxRow; ++i) {
        for(unsigned int j = 0; j < MaxColumn; ++j) {
            matrix[ ( i * MaxColumn ) + j ] = ( i * MaxColumn ) + j;
        }
    }

    // Show
    print( matrix );

    delete[] matrix;
    return 0;
}
相关问题