ためになるホームページ お問い合わせ




TOP > C言語 > 多次元配列とポインタ
多次元配列
C言語では2次元...N次元の配列を使用できる。静的に作成するには、1次元の配列の宣言のように、添字演算子に要素数を指定する。
int a[2][2]; //2x2の配列

多次元配列
#include <stdio.h>

int main(int argc, char** argv)
{
  int a[2][2];
  int i, j;

  for (j = 0; j < 2; j++)
  {
    for (i = 0; i < 2; i++)
    {
      a[j][i] = i + j * 2;
    }
  }

  for (j = 0; j < 2; j++)
  {
    for (i = 0; i < 2; i++)
    {
      printf ("a[%d][%d] = %d\n", j, i, a[j][i]);
    }
  }
  return(0);
}


動的に生成する その1
malloc, calloc関数を使って動的に多次元配列を作成するには、各アドレスに対して必要なサイズを割り当てる。多次元配列で注意しなければならないのは、動的に生成したアドレスは順番に並んでいるわけではない。

動的に2次元の配列を割り当てる例1
#include <stdio.h>
#include <malloc.h>

int main(int argc, char** argv)
{
  int **a;
  int i, j;
  a = malloc (sizeof(int*) * 2);
  //この時点で、aはint型のポインタを2個持つ

  //各ポインタに対して、サイズを割り当てる  
  for (i = 0; i < 2; i++)
  {
    a[i] = malloc(sizeof(int) * 2);
  }

  for (j = 0; j < 2; j++)
  {
    for (i = 0; i < 2; i++)
    {
      a[j][i] = i + j * 2;
    }
  }

   for (j = 0; j < 2; j++)
  {
    for (i = 0; i < 2; i++)
    {
      printf ("a[%d][%d] = %d, address = %p\n", j, i, a[j][i], &a[j][i]);
    }
  }

  //動的に作成したら、解放する
  //freeを呼ぶ数は、malloc,callocした数分
  if (a)
  {
    for (i = 0; i < 2; i++)
    {
      if (a[i])
      {
        free(a[i]);
      }
    }
    free(a);
  }
  return(0);
}


動的に生成する その2
上記の例では、a[0]とa[1]は別々に生成したので、動的に取得したメモリの位置は整列されていない。動的に生成した最初の要素に全ての領域を確保して次の要素にポインタを代入すると、連続したアドレス空間が使用できる。

動的に2次元の配列を割り当てる例2
#include <stdio.h>
#include <malloc.h>

int main(int argc, char** argv)
{
  int **a;
  int i, j;
  a = malloc (sizeof(int*) * 2);
  a[0] = malloc(sizeof(int) * 10);
  a[1] = a[0] + 5;

  for (i = 0; i < 10; i++)
  {
    a[0][i] = i;
  }

  for (j = 0; j < 2; j++)
  {
    for (i = 0; i < 5; i++)
    {
      printf ("a[%d][%d] = %d, address = %p\n", j, i, a[j][i], &a[j][i]);
    }
  }

  //以下のアクセス方法は、上記と同等
  for (i = 0; i < 10; i++)
  {
    printf ("a[0][%d] = %d, address = %p\n", i, a[0][i], &a[0][i]);
  }
  if (a[0])  free(a[0]);
  if (a) free(a);
  return(0);
}







Copyright 2007 ためになるホームページ All Rights Reserved.