指向2D数组的指针

时间:2014-08-30 15:08:03

标签: c arrays pointers multidimensional-array

我给出了以下代码段:

int group1[3][3] = {3,4,5,1,9,8};
int group2[3][3] = {{1},{2,3},{4,5}};
int *gPtr1 = group1;
int *gPtr2 = group2;

这个问题要求我的价值:(我本来应该在纸上回答这个,当然,没有电脑)

*(gPtr1 + 3)
*(gPtr2 + 3)

通常,我知道对于一维数组,它会添加一个"地址"而不是价值。例如:

int  balance[10]={1,2,6,4};
int *p=balance;  //p points to balance [0]

p+=3;           //points to balance [3]

然而,我似乎无法制作一个指向2D数组的指针来测试它,因为在问题中,我总是得到一个"来自不兼容指针类型的初始化"错误。

4 个答案:

答案 0 :(得分:2)

正确的记录看起来像

int ( *gPtr1 )[3] = group1;
int ( *gPtr2 )[3] = group2;

这些表达

*(gPtr1 + 3)
*(gPtr2 + 3)

尝试在数组的最后一个元素之后访问内存,因为数组只有三行。这就是表达式*(gPtr1 + 3)的类型是int[3],并且在oridinal数组中只有三个这样的元素。

或者你可以写

int *gPtr1 = ( int * )group1;
int *gPtr2 = ( int * )group2;

在这种情况下,使用指针将数组解释为具有9个元素和表达式的一维数组

*(gPtr1 + 3)
*(gPtr2 + 3)

将相应返回

1
2

答案 1 :(得分:2)

要访问group1的地址,请以这种方式将其传递给指针:

int *gPtr1 = &group1[0][0];

使用它很容易找到灵魂:1和2。

答案 2 :(得分:0)

也许这会帮助您入门:

#include <stdio.h>

int group1[3][3] = {3,4,5,1,9,8};
int group2[3][3] = {{1},{2,3},{4,5}};

int main( void )
{
    int *p;
    int i;
    for (p = group1[0], i = 0; i < 9; ++i, ++p )
        printf( "%d - ", *p);
    printf( "\n" );
    for (p = group2[0], i = 0; i < 9; ++i, ++p )
        printf( "%d - ", *p);
    printf( "\n" );
    return 0;
}

如果您了解该2D阵列中的内存是如何存储的,那么应该清楚为什么这会起作用。因为我认为理解是你正在寻找的,所以我会让你自己想出那个部分。 : - )

答案 3 :(得分:0)

二维矩阵在存储器中以行主要顺序表示。这是因为内存是一维的,因此它将二维数组存储为连续的行列表。

创建group1时,会得到一个长度为9的整数数组,它看起来像:

3 4 5 1 9 8 _ _ _

因此,当您执行*(gPtr1 + 3)时,会将3添加到gPtr1的原始位置,即3的地址。添加3会将您带到1的位置,您可以取消引用该位置。

因此,当你创建group2时,你得到一个长度为9的整数数组,它看起来像:

1 _ _ 2 3 _ 4 5 _

因此,当您执行*(gPtr2 + 3)时,会将3添加到gPtr2的原始位置,即1的地址。添加3会将您带到2的位置,您可以取消引用该位置。