我怎样才能指向2D数组呢?

时间:2013-12-14 08:11:22

标签: c pointers multidimensional-array

我有一个2D数组。

int MARIO[4][4];

我想在屏幕上显示此数组的值。问题是我不知道如何声明指向2D数组的指针。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:3)

呃,所以回答实际的问题:int (*ptrTo2DArr)[4][4];

答案 1 :(得分:2)

我建议将该数组作为某个结构的字段(可能是唯一的),如

struct my_2darray_st {
   int mariofield[4][4];
};

然后声明你的功能

void myfun(struct my_2darray_st*);

并按如下方式使用:

struct my_2darray_st myarr;
memset (&myarr, 0, sizeof(myarr));
myfun(&myarr);
if (myarr.mariofield[3][1] > 0) dosomething();

H2CO3's answer字面上是正确和明亮的,但我从来没有看到任何使用它的真实代码,例如void myfun(int (*ptrTo2DArr)[4][4]); ....实际上,聚合通常在{...}中struct

您还可以拥有typedef并执行

 typedef int arr4x4t[4][4];
 void myfun(arr4x4t*);

附加物

BTW,使用现代优化编译器,使用struct时完全没有任何惩罚;更具体地说,使用以下代码:

 /* file test2d.c */
 // using a pointer to 2d array
 int f(int (*ptrTo2DArr)[4][4])
 {
   return (*ptrTo2DArr)[0][0] + (*ptrTo2DArr)[1][1]
     + (*ptrTo2DArr)[2][2] + (*ptrTo2DArr)[3][3];
 }

 // using a struct
 struct tab_st {
   int arr[4][4];
 };
 int g(struct tab_st *s) {
   return s->arr[0][0] + s->arr[1][1]
     + s->arr[2][2] + s->arr[3][3];
 }    

 // using a typedef
 typedef int arr4x4t[4][4];
 int h(arr4x4t *t) {
   return (*t)[0][0] + (*t)[1][1]
     + (*t)[2][2] + (*t)[3][3];
 }    

GCC 4.8.2(在我的Debian / Sid / x86-64上,在64位模式下)使用gcc -O2 -S test2d.c调用时(您可能想要添加-fverbose-asm选项)生成 f以及gh

的相同汇编代码
    f:
    .LFB0:
    .cfi_startproc
    movl    (%rdi), %eax    
    addl    20(%rdi), %eax  
    addl    40(%rdi), %eax  
    addl    60(%rdi), %eax  
    ret
    .cfi_endproc

因此没有性能原因可以避免使用struct - s。我发现使用它们更好,因为使用struct - s C代码更具可读性(即使它可能稍微长一点,因为你需要命名结构指针和字段)。这确实只是意见

换句话说,我赞成只有指向标量数据(包括其他指针)的指针 - 用注释或约定来判断它是指向某个一维数组的指针还是只指向一个数据单元 - 或结构或工会。像int (*ptrTo2DArr)[4][4]这样的指针对我来说看起来很奇怪

答案 2 :(得分:0)

  

我想在屏幕上显示这个数组的值。

另一种方法是,您可以声明指向第一个数组的第一个元素的指针,并使用它循环遍历矩阵。如下:

#include <stdio.h>

int main()
{

    int MARIO[4][4]= { {1,2,3,4} , {5,6,7,8} , {9,10,11,12}, {13,14,15,16} };
    int *ptr;
    ptr = &MARIO[0][0];

    int i;
    for (i=0;i<4*4;i++)
        printf("%d\n",*(ptr+i));
}

答案 3 :(得分:0)

2d数组是一个指针数组,有点像幻觉,无论如何这里是一个程序,解释了使用带有2d数组的指针的方法;

#include <stdio.h>

int main(){
    int arr [4][4] = {
        {3,4,3,2}, // [0][0] --> [0][3]
        {4,4,4,4}, // [1][0] --> [1][3]
        {5,6,3,2}, // [2][0] --> [2][3]
        {3,3,3,3} // [3][0] --> [3][3]
    };

    // point to an array of pointers (2d array)
    int (*p)[] = arr;
    printf("%d ", **p);  // **p == arr[0][0] or 3


    printf("%d  \n", (*p)[9]); // (*p)[ index ] treats the 2d array like a 1d array
    // the 9th element is really [2][1]

    // output the array of pointers like it's a 2d array
    int col, row, height = 4;
    for ( row = 0; row < 4; ++row ) {
        for ( col = 0; col < 4; ++col ) {
            printf( "%d", (*p)[row*height+col]);
        }
        printf("\n");
    }
}