有谁知道如何使用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
}
答案 0 :(得分:6)
对void
的含义的解释可能最好地回答了您的问题。
void
基本上表示没有类型。因此,您无法告诉编译器创建类型为void
的对象,例如以下陈述:
new void
new void[...]
这些表达式的含义大致如下:“创建东西”或“分别创建一些东西”。对于编译器来说,这显然不够准确。
然而, void*
(指向void
的指针)是允许的,因为指针从根本上说与编译器完全相同:另一个对象的内存地址。您可以将指针视为指向某种东西的某种箭头。如果您正在使用指针,编译器会看到该箭头,而不是它指向的实际内容。因此编译器不关心“目标类型”是void
。
然而,这样做的结果是你不能取消引用void*
(指向void
的指针),因为这样你就可以使编译器有效地查看指向的东西,这将是一个void
值,对编译器没有任何意义。
<强>摘要强>:
1)您无法创建void
类型的数组,如new void[...]
中所示。
2)您可以创建指向void
(void*
)的指针,甚至是指向{{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;
}