0

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

这是我的示例代码:

     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
        }

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

谢谢 :)

4

5 回答 5

1

破坏内部 * 并将 i 乘以 10 然后添加 j

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

因为在 2d 矩阵中“向下”,您将通过维度 1(在本例中为 10)元素。

对于 3d:

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

对于 N 维:

  *(a+i*(size of i-dimension)+j*(size of j dim)+......+last index)
于 2012-07-20T08:26:32.767 回答
1

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

http://ideone.com/1PyNC

于 2012-07-20T08:28:17.380 回答
1

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

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

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ğrul büyükışık 的回答中那样“展平”它并使用一维数组。

于 2012-07-20T08:39:29.423 回答
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,编译器知道我想跳过五个元素。您可以在 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]);

关于 Ideone 的第二个例子

于 2012-07-20T08:51:44.923 回答
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()。

将(一维数组的大小*要访问的一维数组(i))+一维数组中的特定元素(j)添加到数组的基地址。

于 2012-07-20T09:04:02.227 回答