指定2D数组中的特定位置

时间:2013-09-17 19:48:02

标签: c++ arrays

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

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

当我有2D数组时,我该怎么做?

7 个答案:

答案 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是行长。