0

関数の 1 次元配列にはポインターを使用できますが、2 次元配列に同じ手法を使用する方法はわかりません。

ここに私のコード例があります:

     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
        }

2 次元配列に対して 1 次元配列と同じ手法を使用する方法を教えてください。

ありがとう :)

4

5 に答える 5

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) を配列のベース アドレスに追加します。

于 2012-07-20T09:04:02.227 に答える
1

bは int の配列であるため、その最初の要素は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 の回答のように「平坦化」して、1 次元配列を使用できます。

于 2012-07-20T08:39:29.423 に答える
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

問題は、配列はポインターに減衰しますが、2 次元配列は特定のサイズの配列へのポインターに減衰します。

#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]);
        }
    }
}

ここでは、ご覧のとおり、2 次元関数で配列を 5 つの要素の配列へのポインターとして宣言しています。をインクリメントiすると、コンパイラは 5 つの要素をスキップする必要があることを認識します。この例は 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 の 2 番目の例

于 2012-07-20T08:51:44.923 に答える