書式
データ型 配列名[行の要素数][列の要素数]
int aiScore[3][2] = {[56,60],[65,70],[85,50]};
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次元配列の仕組み
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つ分のメモリを飛び越えた値になっていることがわかる。
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
最初のプログラムをポインタ変数を使用して書換
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列の値