LoginSignup
0
0

More than 5 years have passed since last update.

C言語の基礎 (多次元配列) NO.7 備忘録

Last updated at Posted at 2015-03-21

書式

データ型 配列名[行の要素数][列の要素数]

test.cpp
int aiScore[3][2] = {[56,60],[65,70],[85,50]};
test.cpp
  int aiScore[3][2] = {{56,60},{65,70},{85,50}};  //点数の2次元配列

  int i = 0;  // インデックス1
  int j = 0;  // インデックス2

  int iTotal = 0; // 合計値格納用の変数


  // 0行目の合計値
  for ( i = 0; i < 2; i++ )
  {
    iTotal += aiScore[0][i];
  }

  CCLOG("0行目の合計値:%d",iTotal);

  iTotal = 0;

  // 2列目の合計値
  for ( i = 0; i < 3; i++ )
  {
    iTotal += aiScore[i][1];
  }

  CCLOG("2列目の合計:%d",iTotal);

  // 全体の合計
  for ( i = 0; i<3; i++ )
  {
    for ( j = 0; j<2; j++ )
    {
      iTotal += aiScore[i][j];
    }
  }

  CCLOG("全体の合計値:%d",iTotal);

実行結果
cocos2d: 0行目の合計値:116
cocos2d: 2列目の合計:180
cocos2d: 全体の合計値:566

2次元配列の仕組み

test.cpp
  int aiScore[3][2] = {{56,60},{65,70},{85,50}};  //点数の2次元配列

  for ( int i = 0; i < 3; i++ )
  {
    for ( int j = 0; j < 2; j++ )
    {
      CCLOG("%d行%d列のアドレス:%p 値:%d",i,j,aiScore + (i+j),*(*(aiScore + i) + j));
    }
  }

  CCLOG("%p",aiScore);
  CCLOG("aiScoreのメモリサイズ:%d",(int)sizeof(aiScore));

  CCLOG("0行目のアドレス:%p",aiScore + 0);
  CCLOG("1行目のアドレス:%p",aiScore + 1);
  CCLOG("2行目のアドレス:%p",aiScore + 2);

実行結果
cocos2d: 0行0列のアドレス:0x16fdbe0a0 値:56
cocos2d: 0行1列のアドレス:0x16fdbe0a8 値:60
cocos2d: 1行0列のアドレス:0x16fdbe0a8 値:65
cocos2d: 1行1列のアドレス:0x16fdbe0b0 値:70
cocos2d: 2行0列のアドレス:0x16fdbe0b0 値:85
cocos2d: 2行1列のアドレス:0x16fdbe0b8 値:50
cocos2d: 0x16fdbe0a0
cocos2d: aiScoreのメモリサイズ:24
cocos2d: 0行目のアドレス:0x16fdbe0a0
cocos2d: 1行目のアドレス:0x16fdbe0a8
cocos2d: 2行目のアドレス:0x16fdbe0b0

・aiScoreは要素数が3つの配列へのポインタになっている。
・aiScore + 1 は、要素2つ分のメモリを飛び越えた値になっていることがわかる。

test.cpp
  int aiScore[3][2] = {{56,60},{65,70},{85,50}};  //点数の2次元配列

  int *piData = nullptr;    // int型のポインタ変数の宣言

  piData = (int *)aiScore;  // 配列のポインタをint型にキャストして代入


  for ( int i = 0 ; i < 3 * 2; i++ )
  {
    CCLOG("*(piData + %d)の値:%d",i, *(piData + i));
  }

実行結果
cocos2d: *(piData + 0)の値:56
cocos2d: *(piData + 1)の値:60
cocos2d: *(piData + 2)の値:65
cocos2d: *(piData + 3)の値:70
cocos2d: *(piData + 4)の値:85
cocos2d: *(piData + 5)の値:50

最初のプログラムをポインタ変数を使用して書換

test.cpp
  int aiScore[3][2] = {{56,60},{65,70},{85,50}};  //点数の2次元配列

  int i = 0;  // インデックス1
  int j = 0;  // インデックス2

  int iTotal = 0; // 合計値格納用の変数


  // 0行目の合計値
  for ( i = 0; i < 2; i++ )
  {
//    iTotal += aiScore[0][i];
    iTotal += *(*(aiScore + 0) + i);

  }

  CCLOG("0行目の合計値:%d",iTotal);

  iTotal = 0;

  // 2列目の合計値
  for ( i = 0; i < 3; i++ )
  {
//    iTotal += aiScore[i][1];
    iTotal += *(*(aiScore + i) + 1);

  }

  CCLOG("2列目の合計:%d",iTotal);

  // 全体の合計
  for ( i = 0; i<3; i++ )
  {
    for ( j = 0; j<2; j++ )
    {
      iTotal += *(*(aiScore + i) + j);
    }
  }

  CCLOG("全体の合計値:%d",iTotal);

実行結果
cocos2d: 0行目の合計値:116
cocos2d: 2列目の合計:180
cocos2d: 全体の合計値:566

aiScore + 0 : 0行0列の先頭ポインタ
*(aiScore + 0) : 0行0列の先頭ポインタ(int型)
*(aiScore + 0) + 1 : 0行1列の先頭ポインタ(int型)
*(*(aiScore + 0) + 1) : 0行1列の値

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0