6

一次元配列を二次元配列に変換することはできますか?

次のように、2D配列のポインターを1D配列の先頭に設定するだけです。

int foo[] = {1,2,3,4,5,6};
int bla[2][3] = foo;

次のような 2 次元配列を簡単に作成できるためです。

int bla[2][3] = {1,2,3,4,5,6};

問題は今、ポインターを介して変換する方法はありますか?

4

5 に答える 5

10

int bla[2][3]anを an で初期化することはできません(そのコンテキストでint*何が起こるか)。foo

の配列へのポインターを宣言することで、その効果を得ることができますint

int (*bla)[3] = (int (*)[3])&foo[0];

ただし、寸法が実際に一致していることを確認してください。そうしないと、大惨事が起こります。

于 2012-10-02T14:35:11.317 に答える
4

ポインタを指定したことは知っていますが、配列のデータを2D配列に格納しようとしているようです。memcpy()では、1次元配列から2次元配列までの内容だけではどうでしょうか。

int i, j;
int foo[] = {1, 2, 3, 4, 5, 6};
int bla[2][3];
memcpy(bla, foo, 6 * sizeof(int));
for(i=0; i<2; i++)
   for(j=0; j<3; j++)
      printf("bla[%d][%d] = %d\n",i,j,bla[i][j]);

収量:

bla[0][0] = 1
bla[0][1] = 2
bla[0][2] = 3
bla[1][0] = 4
bla[1][1] = 5
bla[1][2] = 6

それがあなたのすべてですよね?

于 2012-10-02T14:57:10.293 に答える
2
int (*blah)[3] = (int (*)[3]) foo; // cast is required

for (i = 0; i < 2; i++)
  for (j = 0; j < 3; j++)
    printf("blah[%d][%d] = %d\n", i, j, blah[i][j]);

これは1Dから2D配列に変換 されないことに注意してください。これにより、2D配列である fooのようにのコンテンツにアクセスできます。foo

では、なぜこれが機能するのでしょうか。

まず、添え字式は;a[i]として解釈されることを忘れないでください。後の'番目の要素*(a + i)のアドレスを見つけて、結果を逆参照します。したがって、 ;と同等です。次の3要素配列のアドレスを見つけて結果を逆参照するので、のタイプはです。 iablah[i]*(blah + i)iintblahblah[i]int [3]

于 2012-10-02T16:35:05.537 に答える
1

はい、ポインターの配列を使用できる場合:

 int foo[] = {1,2,3,4,5,6};
 int *bla[2]={foo, foo+3};
于 2012-10-02T14:37:30.730 に答える
1

union1 つの配列を別の配列にエイリアスするために使用できます。

#include <stdio.h>

union
{
  int foo[6];
  int bla[2][3];
} u = { { 1, 2, 3, 4, 5, 6 } };

int main(void)
{
  int i, j;

  for (i = 0; i < 6; i++)
    printf("u.foo[%d]=%d ", i, u.foo[i]);
  printf("\n");

  for (j = 0; j < 2; j++)
  {
    for (i = 0; i < 3; i++)
      printf("u.bla[%d][%d]=%d ", j, i, u.bla[j][i]);
    printf("\n");
  }

  return 0;
}

出力 ( ideone ):

u.foo[0]=1 u.foo[1]=2 u.foo[2]=3 u.foo[3]=4 u.foo[4]=5 u.foo[5]=6 
u.bla[0][0]=1 u.bla[0][1]=2 u.bla[0][2]=3 
u.bla[1][0]=4 u.bla[1][1]=5 u.bla[1][2]=6 
于 2012-10-02T15:09:29.180 に答える