2

在二维数组中指定位置的方法是什么。我不是指通过下标获取值,而是以类似于一维数组的方式,在给定指针的情况下,可以使用+运算符并转到该位置。

例如,如果我有一些A大小为 4 的数组,我可以通过 . 转到第三个元素A + 2

当我有一个二维数组时,我该怎么做?

4

7 回答 7

3

A数组在哪里,R行在哪里,列在哪里C

*(A + R) + C

给你地址A[R][C]

于 2013-09-17T19:55:37.683 回答
2

是的,你是对的。您可以通过将行维度乘以列大小并添加列索引来访问元素。

假设您的整数数组是arr[NUMBER_OF_ROWS][NUMBER_OF_COLUMNS],那么您可以通过以下方式访问该arr[ROW_INDEX][COLUMN_INDEX]元素:

int num = *((int *)arr + ROW_INDEX * NUMBER_OF_COLUMNS + COLUMN_INDEX);
于 2013-09-17T19:56:36.740 回答
1

这个问题不清楚,但这里有一些想法。

语言中没有多维数组,只支持一维数组,并有一些额外的保证。通常所说的二维数组是给定类型数组类型的对象的一维数组。额外的保证是连续性和对齐的:数组中的每个元素与数组中的下一个元素是连续的,并且数组和第一个元素是对齐的。

数组倾向于衰减为指向第一个元素的指针,您可以使用指针算术移动到数组中的下一个元素,这就是语法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]
于 2013-09-17T20:03:37.843 回答
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;
}
于 2013-09-17T20:07:42.453 回答
0

基于指针算术的其他答案在技术上是正确的,但前提是您确定您的数组是像 A[rows][cols] 那样分配的。通常情况并非如此,即使您这样实现数组,您也不能确定其他开发人员不会重构它。当其他开发人员将类型 A[rows][cols] 更改为 vector<vector< type >> A 时,您的代码就会中断。

因此,我建议不要跨行使用指针算术。如果您担心性能 - 不要:编译器将自动使用指针算法来访问适用的数组元素。更重要的是,编译器不会在不适用的地方使用指针算法。

于 2013-09-17T20:18:35.347 回答
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].

于 2013-09-17T19:55:30.810 回答
-2

二维数组在内存中逐行存储,因此您可以A[i][j]使用索引 A+i*N+j访问,其中 N 是行长。

于 2013-09-17T20:04:02.190 回答