有谁知道如何使用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)
你的问题最好通过对什么void方法的解释来解答.
void基本上表示没有类型.因此,您无法告诉编译器创建类型的对象void,例如使用以下语句:
new voidnew 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)
| 归档时间: |
|
| 查看次数: |
1623 次 |
| 最近记录: |