在二维数组中指定位置的方法是什么。我不是指通过下标获取值,而是以类似于一维数组的方式,在给定指针的情况下,可以使用+
运算符并转到该位置。
例如,如果我有一些A
大小为 4 的数组,我可以通过 . 转到第三个元素A + 2
。
当我有一个二维数组时,我该怎么做?
A
数组在哪里,R
行在哪里,列在哪里C
。
*(A + R) + C
给你地址A[R][C]
是的,你是对的。您可以通过将行维度乘以列大小并添加列索引来访问元素。
假设您的整数数组是arr[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS]
,那么您可以通过以下方式访问该arr[ROW_INDEX][COLUMN_INDEX]
元素:
int num = *((int *)arr + ROW_INDEX * NUMBER_OF_COLUMNS + COLUMN_INDEX);
这个问题不清楚,但这里有一些想法。
语言中没有多维数组,只支持一维数组,并有一些额外的保证。通常所说的二维数组是给定类型数组类型的对象的一维数组。额外的保证是连续性和对齐的:数组中的每个元素与数组中的下一个元素是连续的,并且数组和第一个元素是对齐的。
数组倾向于衰减为指向第一个元素的指针,您可以使用指针算术移动到数组中的下一个元素,这就是语法A + 2
含义:&A[0] + 2
或将 2 添加到数组中的第一个(第零个)元素。但衰减只是顶层数组。
前面提出的保证意味着您可以将数组用作指向第一个元素的指针,并且该元素与数组本身位于完全相同的位置。将此递归应用于嵌套数组,您可以得到以下结果:
int array[10][10];
// array is an array of 10 arrays of 10 int
// array[0] is an array of 10 int, the first subarray
// array[0][0] is an int, the first element of the subarray
int *p = &array[0][0];
int *q = p + 10; // One beyond the first subarray: pointer to the first
// element of the second subarray.
int *r = p + 10*row + col; // pointer to the col-th element inside the row-th subarray
// equivalent to &array[row][col]
这是一些自学测试代码。希望有帮助。
#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;
}
基于指针算术的其他答案在技术上是正确的,但前提是您确定您的数组是像 A[rows][cols] 那样分配的。通常情况并非如此,即使您这样实现数组,您也不能确定其他开发人员不会重构它。当其他开发人员将类型 A[rows][cols] 更改为 vector<vector< type >> A 时,您的代码就会中断。
因此,我建议不要跨行使用指针算术。如果您担心性能 - 不要:编译器将自动使用指针算法来访问适用的数组元素。更重要的是,编译器不会在不适用的地方使用指针算法。
通过一次取消引用一个级别。对于 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]
.
二维数组在内存中逐行存储,因此您可以A[i][j]
使用索引 A+i*N+j
访问,其中 N 是行长。