我需要在某个数组中存储 n * 2
个值。
我可以轻松做到这一点
int n=5; //in real world this is calculated at runtime
int* arr;
arr = new int[n*2]
//fill arr with values
我需要 arr
具有 n X 2 值,而不仅仅是 n,arr
存储成对的值,这并非巧合。
我可以简单地知道存储了什么以及如何存储,并通过将索引偏移 n 来访问这些对,
cout<<"first pair is"<<arr[0]<<","<<arr[n];
cout<<"second pair is"<<arr[1]<<","<<arr[n+1]
cout<<"last pair is"<<arr[n-1]<<","<<arr[n+n-1]
但是,如果我可以像二维数组一样访问这些值,例如
cout<<"first pair is"<<arr[0][0]<<","<<arr[0][1];
cout<<"second pair is"<<arr[1][0]<<","<<arr[1][1];
cout<<"last pair is"<<arr[n][0]<<","<<arr[n][1]
我不只是将 arr 声明为二维数组的原因是 n
仅在运行时才知道。
这可以在 C++ 中以某种方式完成吗?
编辑:出于性能原因,我更喜欢数组而不是任何其他对象结构。我知道现代计算机上几乎不存在性能差异,但这是我的限制。它仍然必须只是存储在连续内存中的一些整数。
关于重复的编辑:被建议为重复的问题非常贴近实际,尽管不完全一样,但该问题的答案只是一种解决方法,而不是直接答案。我更乐意简单地得到一个权威的答案,即这是不可能的,而不是有替代的解决方案。我不是在寻找解决方案,因为我已经在问题本身中有了解决方案。我正在寻找我的问题的答案。
最佳答案
只要 2
是编译时常量,您就可以在 C++ 中轻松执行此操作:
const int n = 7;
int (*arr)[2] = new int[n][2];
arr[2][1] = 42;
这将 arr
声明为指针 *arr
,指向两个元素 (*arr)[2]
的数组,这两个元素都是整数 int (*arr)[2]
。这个新指针是用 new
分配的合适指针初始化的。
(*arr)
两边的括号是必需的,因为数组下标运算符 []
的优先级高于间接运算符 *
,并且括号强制运算符的正确顺序。
结果指针的使用完全如您所愿,内存被分配在一 block 中,并且您可以通过简单的操作摆脱它
delete[] arr;
<小时/>
编译时常数限制仅存在于 C++ 中,C 更宽松,允许您编写类似的内容
void foo(int width, int height) {
int (*image)[width] = malloc(height*sizeof(*image));
image[height-1][width-1] = 42;
...
其中二维数组的两个维度都是动态的。 C++ 禁止这样做,迫使您对除最外层维度之外的所有维度使用编译时大小。
关于c++ - 如何使用二维语法访问指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58592908/