为什么我们使用双指针来引用在堆上分配的 2D 数组
Why do we use double pointers to reference a 2D array allocated on the heap?
所以讲座示例有以下代码
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;
}
}
我对上面的代码(以及堆上的多维数组)有几个问题:
- 我们是否必须初始化数组中的每个元素,如图所示?还是在 a[i] = new int [5] 之后剪切代码就足够了?
我知道在堆栈上分配的数组,使用变量作为堆栈大小是非法的
CIN>> n;
int a[n];
但是堆分配的数组合法吗?如,a = new int[n]?
为什么它是指向此数组的双指针?通常对于一维数组,我们使用单个指针作为 int *a = new int[10]?如果我想要数组元素本身的值,我是否像 **a 一样尊重两次?还是我还做*a?
假设我有一个 2D 对象数组的某个类。我将如何访问第 ith, j 元素的成员字段 var?如果我想在 ith, j 元素中调用对象的成员函数怎么办?
-
您不必初始化数组中的每个元素。 如果不这样做,数组的内容将未定义。 或者,您可以使用
new int[5]()
进行零初始化。 -
a = new int[n]
在堆上工作,因为实际上有一个运行时调用来标记新内存以用作a
指向的数据。 它不能在堆栈上工作,因为编译器需要知道任何特定函数调用的堆栈帧有多大,因此该值在编译时必须是可计算的。 -
您需要双指针,因为 a 是指向整数的指针。 它指向一个数组数组,每个数组在访问值时都需要取消引用。 您通常会使用 a[i][j] 来访问特定元素,这实际上是双重参照。
如果在编译时已知矩阵中的列数,则可以只分配一个矩阵:
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;
相关文章:
- 将数组的地址分配给变量并删除
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 获取字符串的长度并将其分配给数组
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 使用递归模板动态分配的多维数组
- 如何正确填充在堆上分配的二维数组?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 关于字符数组,我正在尝试将数组中的每个字符分配给另一个值
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- 无法分配C++数组
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 分配 2D 可变大小的数组
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 动态分配字符数组的内存
- C++具有动态分配的字符数组的结构
- C 通过参考分配 /数组传递内存
- 使用字符串或字符动态分配(数组)