C:二维数组的指针

时间:2012-07-20 08:21:02

标签: c multidimensional-array

我可以将指针用于一维数组的函数,但我不知道对二维数组使用相同的技术。

这是我的示例代码:

     int main(){
          int b[10]; //initialize b
          Print(b);
          int a[10][10]; //initialize a
          Print2(a);
        }

        void Print(int*b){  
           for(int i=0; i<10; i++)
              printf("%d\n",*(b+i));
        }

    // I want to use same technique here
    // but i have met error 

        void Print2(int*a){
           for(int i=0; i<10; i++)
              for(int j=0; j<10; j++)
                  printf("%d\n",*(*(a+i)+j));  // error at this line
        }

请帮助我如何对二维数组使用相同的一维数组技术。

谢谢:)

5 个答案:

答案 0 :(得分:1)

摧毁内部*并用10乘以i然后加上j

 printf("%d\n",*((a+i*10)+j));

因为在2d矩阵中“向下”,所以你会经历维度-1(在这个例子中为10)元素。

for 3d:

 printf("%d\n",*(a+i*100+j*10+k));

表示N维:

  *(a+i*(size of i-dimension)+j*(size of j dim)+......+last index)

答案 1 :(得分:1)

我发现这种粘贴非常有用,称为“阵列衰减”。检查每个示例行上方的注释类型。

http://ideone.com/1PyNC

答案 2 :(得分:1)

b是一个int数组,因此它的第一个元素是int。当b衰减到指向其第一个元素的指针时,结果为int*(这就是Print函数接受的内容。)

a是一个数组数组,因此它的第一个元素是一个数组。当a衰减到指向其第一个元素的指针时,结果就是指向10-int数组的指针:

void Print2(int (*a)[10] ){    // pointer-to-array type
    for(int i=0; i<10; i++)
        for(int j=0; j<10; j++)
            printf("%d\n",a[i][j]);
}

多维数组只能让你在C中到目前为止,因为当你传递它们时,只有第一个维度是可变的。其余维度需要在编译时知道,因为它们是指针类型的一部分。如果你需要在多个维度上变量的东西,你可以像在tuğrulbüyükışık的答案中“扁平”它并使用一维数组。

答案 3 :(得分:1)

问题是,数组衰减到指针,但是一个二维数组衰减到指向特定大小数组的指针。

#include "stdio.h"

void print(int *arr);
void print2D(int (*arr)[]);

int main() {
    int data[5] = {1, 2, 3, 4, 5};
    print(data);

    int data2D[5][5];
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            data2D[i][j] = (i + 1) * 10 + (j + 1);
        }
    }
    print2D(data2D);
}

void print(int *arr) {  
    for (int i = 0; i < 5; i++) {
        printf("%d\n", arr[i]);
    }
}

void print2D(int (*arr)[5]) {  
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            printf("%d\n", arr[i][j]);
        }
    }
}

在这里,正如您所看到的,我在二维函数中声明了数组作为指向5个元素数组的指针。现在,当我增加i时,编译器知道我想要跳过五个元素。你可以run this example at Ideone

当然,你可以手动完成。在这种情况下,您必须自己计算地址。在这种情况下,函数将如下所示:

void print2D(int *arr) {  
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            printf("%d\n", *(arr + (i * 5) + j));
        }
    }
}

你必须这样称呼它:

print2D(data2D[0]);

The second example on Ideone

答案 4 :(得分:1)

        #include <stdio.h>

        void Print(int*b)
        {
        int i;
           for(i=0; i<10; i++)
              printf("%d\n",*(b+i));
        }


        void Print2(int*a)
        {
           int i,j;
           for( i=0; i<10; i++)
           {
              printf("\n");
              for(j=0; j<10; j++)
                  printf("%d\t",*(a+(i*10)+j));  // Modification done here.
           }
        }

        int main()
        {
          int b[10]; //initialize b
          Print(b);
          int a[10][10] = {}; //initialize a 0
          Print2((int*)a);
          return 0;
        }

我修改了Print2()。

  

添加(1D数组的大小*要访问哪个1D数组(i))+   1D数组(j)中的特定元素到数组的基址。