所以讲座示例包含以下代码
int **a;
a = new int*[10];
for (int i = 0; i < 10; ++i){
a[i] = new int[5];
for (int j = 0; j < 5; ++j){
a[i][j] = i*10+5;
}
}
我对上面的代码(以及堆上的多维数组)有一些问题:
我知道在堆栈上分配的数组,使用变量作为堆栈大小是非法的
cin&gt;&gt; N;
int a [n];
但对于堆分配的数组是否合法?如,a = new int [n]?
为什么它是指向这个数组的双指针?通常对于1D数组,我们使用单个指针作为int * a = new int [10]?如果我想要数组元素本身的值,我是否需要两次作为** a?或者我还做*?
所以说我有一些Class的2D数组。我如何访问第i个,第j个元素的成员字段var?如果我想在第i个,第j个元素中调用对象的成员函数怎么办?
答案 0 :(得分:2)
您没有 来初始化阵列中的每个元素。如果你不这样做,那么数组的内容将是未定义的。或者,您可以使用new int[5]()
进行零初始化。
a = new int[n]
在堆上工作,因为它实际上是一个运行时调用,用于标记新内存以供a
指向的数据使用。它无法在堆栈上工作,因为编译器需要知道任何特定函数调用的堆栈帧有多大,因此该值必须在编译时可计算。
您需要一个双指针,因为a是指向指向整数的指针。它指向一个数组数组,每个数组在访问该值时都需要取消引用。您通常会使用[i] [j]来访问特定元素,这有效地进行了双重推理。
答案 1 :(得分:1)
如果在编译时已知矩阵中的列数,则可以只分配一个矩阵:
int nrow = 10; // number of rows assigned at run time
int (*a)[5]; // pointer to array of 5 ints
a = new int[nrow][5]; // allocate matrix
for (int i = 0; i < nrow; ++i) // initialize matrix
for (int j = 0; j < 5; ++j)
a[i][j] = i*nrow+j;
// ...
delete[] a;