LoginSignup
0
0

More than 5 years have passed since last update.

C言語の基礎 (配列とポインタ) NO.6 備忘録

Posted at
test.cpp
  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

配列をポインタ利用に書換

test.cpp
  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

つまり、配列の定義で使われる変数名が、その配列のポインタ変数になっている。

test.cpp

  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])

配列を関数に渡すときは、配列のサイズを別途で渡す!!

test.cpp

  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

このプログラムをポインタを使ってみる

test.cpp
  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);

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