BONO's pageプログラム覚書

配列に関するメモ [2004年7月]

- 配列を0で初期化する方法
  • 宣言した要素数よりも指定した初期値が少ないとき,残りの要素は0で初期化される.よって,これを利用することによって,ローカル変数として宣言した配列全体を0で初期化することができる.
プログラム例
 int dat[ 5 ] = { 0 } ;
  • なお,グローバル変数と静的変数は,宣言と同時に初期化される.
  • 0以外の値で初期化する場合は,forループを利用する.
プログラム例
 int dat [ 5 ];
 int i;

 for ( i = 0 ; i < 5 ; i++ )
 {
  dat [ i ] = 100;
 }
  • 二次元配列でも同様の方法が利用できる.
プログラム例
 int dat [ 2 ] [ 5 ] = { 0 };

- 二次元配列の要素へのアクセスは,順序を変えると速度が変わる
  • 通常のC/C++言語でメモリ配置上,高速になる二次元配列のアクセスは次のようになる.
プログラム例
 for ( i = 0 ; i < 行数 ; i++ )
 {
    for ( j = 0 ; j < 列数 ; j++ )
    {
        配列[i][j]に対する処理;
    }
 }

- 配列名は,配列の先頭アドレスを表す定数である
  • 値を代入することはできない.
  • たとえば,datは配列の先頭アドレスを表している.

- 配列を簡単にコピーする.
  • memcpy関数を利用する.
  • この関数は,stdio.hまたはmemory.hに定義されている.
    • memcpy(コピー先配列名,コピー元配列名,サイズ);
  • という書式で実行する.サイズには,コピーする配列のサイズを指定するため,
    • sizeof(コピー元配列名)
  • のようにsizeof演算子を利用すると便利.
サンプルコード
int src[]={1,2,3,4,5};
int dest[5];

memcpy(dest,src,sizeof(src));

- ありえない値を利用して,配列の終わりを表す方法
  • 配列の最後を表す値を,配列に代入する値としてはありえない値に決めておけば,int型やfloat型の配列で配列の終端を自動的に判別することができる.
サンプルコード
 int dat[]={1,2,3,4,5,-999,6,7,8,9,10};
 int i;

 i=0;
 while(dat[i] != -999)
 {
     printf("dat[%d] %d\n",i,dat[i]);
     i=i+1;
 }
- 二次元配列を一次元配列で扱う方法
  • 行のインデックス=一次元配列のインデックス/二次元配列の列数 の商
    列のインデックス=一次元配列のインデックス/二次元配列の列数 の余り
サンプルコード
 i = x / jmax;
 j = x % jmax + 1;
- 構造体の配列を利用する
  • 構造体は,データ型の異なる複数のデータをまとめて扱うことができる.
    また他のデータ型と同じように,配列を作成することもできる.
サンプルコード
 #include <Stdio.h>

 int main(void)
 {
   /* 構造体の宣言 */
   struct score {
   char name[10];
   int kokugo;
   int sansu;
   int rika;
   int shakai;
 };

 /* 変数の宣言 */
 struct score dat[]={
                    {"太郎",85,60,70,82},
                    {"花子",62,78,95,80},
                    {"二郎",70,95,100,63},
                    {"桃子",75,80,69,92},
                    {"三郎",100,72,90,90},
                    };

  int i;
  int total=0;

  for(i=0;i<5;i++)
  {
    total=dat[i].kokugo+dat[i].sansu+dat[i].rika+data[i].shakai;
  }
  return 0;

 }



[前画面に戻る]

Copyright(C)1998 Shinichi Takeshita.All Rights Reserved.