在2D数组中指定位置的方法是什么。我并不是指通过下标来获取值,而是以类似于给定指针的1D数组的方式,可以使用+
运算符并转到该位置。
例如,如果我有一个大小为4的数组A
,我可以通过A + 2
转到第三个元素。
当我有2D数组时,我该怎么做?
答案 0 :(得分:3)
A
是数组,R
是行,C
是列。
*(A + R) + C
为您提供A[R][C]
答案 1 :(得分:2)
是的,你是对的。您可以通过将行维度乘以列大小并添加列索引来访问该元素。
假设您的整数数组为arr[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS]
,那么您可以访问arr[ROW_INDEX][COLUMN_INDEX]
元素:
int num = *((int *)arr + ROW_INDEX * NUMBER_OF_COLUMNS + COLUMN_INDEX);
答案 2 :(得分:1)
问题尚不清楚,但这里有一些想法。
语言中没有多维数组,只支持一维数组,还有一些额外的保证。通常称为2D阵列的是给定类型的阵列类型的一维对象阵列。附加保证是连续性和对齐的保证:数组中的每个元素都与数组中的下一个元素连续,并且数组和第一个元素是对齐的。
数组倾向于衰减指向第一个元素的指针,你可以使用指针算法移动到数组中的下一个元素,这就是允许语法{{1} }含义:A + 2
或指针,它是向数组中第一个(第零个)元素添加2的结果。但衰变只是顶级数组。
之前提出的保证意味着您可以使用数组,就好像它是指向第一个元素的指针一样,并且该元素与数组本身位于完全相同的位置。将此递归应用于嵌套数组,您可以获得以下内容:
&A[0] + 2
答案 3 :(得分:0)
一次取消引用一个级别。对于2D阵列和3D阵列:
#include <cstdio>
int A[2][2];
int B[2][2][2];
int main() {
// Set A[1][1] to 2
*(*(A+1) + 1) = 2;
printf("%d\n", A[1][1]);
// Set B[1][1][1] to 3
*(*(*(B+1) + 1) + 1) = 3;
printf("%d", B[1][1][1]);
}
一般来说,*(...*(*(array_of_N_dimensions + D1) + D2) ... + DN)
会为您提供array_of_N_dimensions[D1][D2]...[DN]
的访问权限。
答案 4 :(得分:0)
这是一些自学教学测试代码。希望有所帮助。
#include < iostream >
int main()
{
int a[2][2];
a[0][0] = 1;
a[0][1] = 2;
a[1][0] = 3;
a[1][1] = 4;
for (int i=0; i < 4; ++i)
{
std::cout << *(*a+i) << std::endl;
}
return 0;
}
答案 5 :(得分:0)
基于指针算法的其他答案在技术上是正确的,但前提是你确定你的数组被分配为A [rows] [cols]。通常情况并非如此,即使您实现了这样的数组,也无法确定其他开发人员不会重构它。另一个开发人员将类型A [rows] [cols]更改为vector&lt;矢量&lt;类型&gt; &GT;你的代码会破裂。
因此我建议不要跨行使用指针算法。如果您担心性能 - 请不要:编译器将自动使用指针算法来访问适用的数组元素。更重要的是,编译器不会在不适用的情况下使用指针运算。
答案 6 :(得分:-2)
二维数组在内存中逐行存储,因此您可以使用 index A[i][j]
访问A+i*N+j
,其中N是行长。