我可以使用 C++ 中的指针访问二维数组的元素吗?

Posted

技术标签:

【中文标题】我可以使用 C++ 中的指针访问二维数组的元素吗?【英文标题】:Can I access elements of a 2D array using pointers in C++? 【发布时间】:2013-06-08 14:05:43 【问题描述】:

对于一维数组,我可以使用数组名作为指针并为其添加偏移量以访问数组的每个元素。二维数组有类似的东西吗?

我定义了一个二维数组如下

int arr[2][3] = 1,2,3, 4,5,6;

int** arrPtr = arr;

但第二行出现编译器错误。二维数组不应该有int**类型吗?

我在这里遇到了另一个线程:

C++ Accessing Values at pointer of 2D Array

看到了这个:

2dArray = new int*[size];

谁能告诉我int*[size] 是什么意思? (sizeint,我猜)。

非常感谢。

【问题讨论】:

虽然数组可以衰减为指针,但数组数组不能衰减为双指针。优先使用 std::arraystd::vector 而不是 C 数组 二维数组和指向指针的指针具有完全不同的内存布局。二维数组分配连续内存,而指针指针可以指向非连续内存,因此它们不可交换 谢谢,只是有时由于限制我不得不使用数组.. 【参考方案1】:

像你这样定义的多维数组只是一个指针,因为数据是按顺序编码的。因此,您可以执行以下操作:

int arr[2][3]=1,2,3,4,5,6;
int* arrPtr = (int*)arr;

通常,arrPtr + a*bSize + b 可以访问指向 arr[a][b] 元素的指针,其中 bSize 是第一个数组维度的大小(在本例中为 3)。

您的第二个问题与动态内存分配有关 - 在运行时分配内存,而不是在程序启动时定义固定数量。我建议在使用动态分配的二维数组之前查看cplusplus.com 上的动态内存分配。

【讨论】:

谢谢!我刚刚意识到 int*[size] 的语法不是 int 乘以 [size],而是一个指针数组..【参考方案2】:

int* array[10] 表示一个包含 10 个整数指针的数组。

您可以使用指向其第一个条目的简单指针来访问二维数组,并利用空间位置原理进行一些数学运算。

int array[2][2] = 1,2, 3, 4;
int* p = &array[0][0];
for(int i=0; i<2*2; i++)
   printf("%d ", *(p++));

如果你有一个矩阵:

 1 2
 3 4

在内存中按顺序编码为 1 2 3 4 ;)

【讨论】:

@user2465355:在这里,最好的感谢是接受一个人的答案,点击上面的勾号:P,但我很高兴有用

以上是关于我可以使用 C++ 中的指针访问二维数组的元素吗?的主要内容,如果未能解决你的问题,请参考以下文章

C中的二维数组和指针 - 如何访问元素?

如何使用指针表达式访问 C 中的二维数组的元素?

c++ 二维数组内存分配

如何在 C++ 中分配一个二维指针数组

二维数组与双重指针

如何使用指针访问这个二维数组的元素?