【发布时间】:2018-05-18 23:20:30
【问题描述】:
对于一维数组(例如整数),我知道如何为堆和堆栈中的分配创建指针
-栈中的指针和栈中的数组
int a[3];
int *ptr=a;
-堆栈中的指针和堆中的数组
int *ptr=new int[3];
但是对于矩阵(例如 3x2),指针可以创建为指针数组int (*A)[3] 或双指针int **A。
我想知道这两种创建指向多维数组的指针的主要区别。
特别是我已经看到了用于创建指向存储在堆栈中的矩阵数组的指针的指针数组:
int A[2][3];
int (*ptr)[3]=A;
我已经看到了用于在堆中分配的矩阵的双指针
int **ptr= new *[3];
for(int i=0; i<=3; i++) int ptr[i]=new [2];
但是是否也可以将指针数组用于堆,将双指针用于堆栈?
再一次,更一般地说,指针数组和双指针之间的主要区别是什么?
【问题讨论】:
-
这样的问题每周会在 SO 上弹出一次。搜索时发现了什么?
-
This post 详细介绍了 C 中的数组内部结构。存在明显差异(某些技术不能应用于 C++),但内存布局的一般要点是相同的。
-
对于矩阵,我通常更喜欢使用一维数组(顺便说一句。这就是
int a[2][3]通常在 AFAIK 下所做的),由于连续内存,性能要好得多(与用int *a[2]单独分配每一行或每一列)。此外,出于同样的原因(dcache 性能),您的矩阵是行优先还是列优先以及随后如何迭代它也很重要。
标签: c++ arrays pointers matrix heap-memory