c++ - 如何使用二维语法访问指针?

标签 c++ arrays

我需要在某个数组中存储 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/

相关文章:

声明字节数组时出现 C++ 语法错误

java - 无法将商品添加到购物车对象数组 (Java)

javascript - 为什么像 'filter' 和 'map' 这样的数组函数在 Angular 的 'ngFor' 表达式中不起作用?

c++ - 做.. while 循环 : How should I do so that the input (int) does not include digit '1' or '0' ?

c++ - 带有 GMock 的 EXPECT_DEATH - 未能死亡

c++ - 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?

python - 在 python 2.7 中添加字节

javascript - JS 函数没有被调用?

c++ - freopen() 在 Mac 上不起作用

c++ - 文件与文件流