int aiData[3] = { 10,20,30 }; //初期化した配列の宣言
int data = aiData[0]; // 0番目の要素の取り出し
int i = 0; // インデックス
for ( i = 0; i<sizeof(aiData) / sizeof(int); i++ )
{
CCLOG("aiData[%d]の値:%d",i,aiData[i]);
}
aiData[0] = 100; // 値の変更
CCLOG("%d",aiData[0]);
実行結果
cocos2d: aiData[0]の値:10
cocos2d: aiData[1]の値:20
cocos2d: aiData[2]の値:30
cocos2d: 100
配列をポインタ利用に書換
int aiData[3] = { 10,20,30 }; //初期化した配列の宣言
int data = aiData[0]; // 0番目の要素の取り出し
int i = 0; // インデックス
for ( i = 0; i<sizeof(aiData) / sizeof(int); i++ )
{
CCLOG("aiData[%d]の値:%d",i,*(aiData + i));
}
*(aiData + 0) = 100;
CCLOG("%d",aiData[0]);
CCLOG("aiDataの値:%p",aiData);
CCLOG("aiData[0)の値のアドレス%p",&aiData[0]);
CCLOG("aiData[1)の値のアドレス%p",&aiData[1]);
CCLOG("aiData[2)の値のアドレス%p",&aiData[2]);
実行結果
cocos2d: aiData[0]の値:10
cocos2d: aiData[1]の値:20
cocos2d: aiData[2]の値:30
cocos2d: 100
cocos2d: aiDataの値:0xbff171a0
cocos2d: aiData[0)の値のアドレス0xbff171a0
cocos2d: aiData[1)の値のアドレス0xbff171a4
cocos2d: aiData[2)の値のアドレス0xbff171a8
つまり、配列の定義で使われる変数名が、その配列のポインタ変数になっている。
int aiData[3] = { 10,20,30 }; //初期化した配列の宣言
printDataArray(aiData);
void AppDelegate::printDataArray(int aiData[])
{
for ( int i = 0; i<sizeof(*aiData) / sizeof(int); i++ )
{
CCLOG("aiData[%d]の値:%d",i,*(aiData + i));
}
*(aiData + 0) = 100;
CCLOG("%d",aiData[0]);
CCLOG("aiDataの値:%p",aiData);
CCLOG("aiData[0)の値のアドレス%p",&aiData[0]);
if (sizeof(*aiData) == sizeof(aiData[0]))
CCLOG("同じ");
}
実行結果
cocos2d: aiData[0]の値:10
cocos2d: aiData[1]の値:20
cocos2d: 100
cocos2d: aiDataの値:0x16fd2a0a8
cocos2d: aiData[0)の値のアドレス0x16fd2a0a8
cocos2d: aiData[1)の値のアドレス0x16fd2a0ac
cocos2d: aiData[2)の値のアドレス0x16fd2a0b0
cocos2d: 同じ
for文のループ回数おかしくね??
実はsizeof(aiData)の値がおかしい。
配列を定義したときのサイズは12だが、別の関数に渡したポインタ変数に対しては単にポインタ変数のサイズ4になっている。
sizeof(*aiData) == sizeof(aiData[0])
配列を関数に渡すときは、配列のサイズを別途で渡す!!
int aiData[3] = { 10,20,30 }; //初期化した配列の宣言
printDataArray(aiData,sizeof(aiData) / sizeof(int));
void AppDelegate::printDataArray(int aiData[], int iSize)
{
for ( int i = 0; i < iSize; i++ )
{
CCLOG("aiData[%d]の値:%d",i,*(aiData + i));
}
*(aiData + 0) = 100;
CCLOG("%d",aiData[0]);
CCLOG("aiDataの値:%p",aiData);
CCLOG("aiData[0)の値のアドレス%p",&aiData[0]);
}
実行結果
cocos2d: aiData[0]の値:10
cocos2d: aiData[1]の値:20
cocos2d: aiData[2]の値:30
cocos2d: 100
cocos2d: aiDataの値:0x16fd560a8
cocos2d: aiData[0)の値のアドレス0x16fd560a8
このプログラムをポインタを使ってみる
int aiData[3] = { 10,20,30 }; //初期化した配列の宣言
printDataArray(aiData,sizeof(aiData) / sizeof(int));
void AppDelegate::printDataArray(int *piData, int iSize)
{
for ( int i = 0; i < iSize; i++ )
{
CCLOG("piData[%d]の値:%d",i,*(piData + i));
}
*(aiData + 0) = 100;
CCLOG("aiDataの値:%p",piData);
CCLOG("aiData[0)の値:%d",*(piData + 0));
CCLOG("aiData[1)の値:%d",*(piData + 1));
CCLOG("aiData[2)の値:%d",*(piData + 2));
}
実行結果
cocos2d: piData[0]の値:10
cocos2d: piData[1]の値:20
cocos2d: piData[2]の値:30
cocos2d: 100
cocos2d: piData[0)の値:100
cocos2d: piData[1)の値:20
cocos2d: piData[2)の値:30
関数にポインタ変数を渡したことで、配列かどうかは失われている。
アドレスを表す書き方
&aiData[0];
aiData + 0;
値を表す書き方
aiData[0];
*(aiData + 0);