指针和多维数组的C++双重间接

Nao*_*dar 1 c++ arrays pointers multidimensional-array

所以我一直在努力理解指针,我发现了这个:

double **DPtr; // just for example

我已经读过它可以用来指向一个多维数组但是在我使用单个间接符号(*)之前我无法使它工作.

那么,如果我不能对多维数组使用双重间接,它的用途是什么?

我试图找到答案,但我没有运气.

提前感谢您提供给我的任何信息!:)

Rei*_*ica 5

你的问题不太清楚.您可以使用a double**创建自己的二维数组,并进行大量手动记录:

const size_t dim1 = 10, dim2 = 20;

double **arr;
arr = new double*[dim1];
for (size_t idx = 0; idx < dim1; ++idx) {
  arr[idx] = new double[dim2];
}
double[4][5] = 3.14;
Run Code Online (Sandbox Code Playgroud)

在某种意义上,阵列甚至可能是"锯齿状的",每个"主"索引的每个"辅助"数组的大小可以是不同的.

但是,它实际上是一个指向数组的指针数组,它不是一个真正的二维数组,因为它在内存中不是连续的.如果您改为创建一个真正的二维数组:

double arr[dim1][dim2];
Run Code Online (Sandbox Code Playgroud)

然后没有办法安全地将其转换为不可取代的double **p.原因是地址处的存储器p[2]存储指针double,而地址arr [2]处的存储器存储double(来自doubles 数组的第一个存储器).

编辑

基于您在注释中表达的"主要问题":双重间接在C++中不如在C中有用.C没有引用,因此如果您希望函数提供指针类型的输出参数,则必须采用一个双指针.例:

void allocate(int style, char **arr)
{
  switch (style) {
    case 0: *arr = malloc(100); break;
    case 1: *arr = malloc(200); break;
    default: *arr = malloc(300); break;
  }
}

int main(void)
{
  char *a;
  allocate(1, &a);  //this way, allocate can modify a
}
Run Code Online (Sandbox Code Playgroud)

在C++中,您可以通过引用传递指针来实现相同的目的:

void allocate(int style, char * &arr)
{
  switch (style) {
    case 0: arr = new char[100]; break;
    case 1: arr = new char[200]; break;
    default: arr = new char[300]; break;
  }
}

int main()
{
  char *a;
  allocate(1, a);  //a is passed by reference, allocate can modify it
}
Run Code Online (Sandbox Code Playgroud)

一般来说,如果需要动态内存,尽量避免使用C++中的原始指针并直接使用对象,或使用智能指针.双间接指针甚至更少见.