Project_OKI’s diary

エンジニアの勉強ブログ

C言語基礎知識3(配列)

C言語の配列の使い方の学習

1.目的

  • C言語で配列が使えるようになる。

目次

2.配列とは

 同じデータ型の数値や文字列を1つの変数にまとめたもの。

 書き方:

     型名 配列名[要素数]={0番の数値,1番の数値,2番の数値,・・・};

3.プログラムの作成

配列を使って、配列に格納した数値を表示する。

#include <stdio.h>
 int main(void){
     // Your code here!
     //配列の使い方
     //宣言と初期化方法
     //型名 配列名[要素数]={0番の数値,1番の数値,2番の数値,・・・};
     
     //変数宣言
     int i;                  //ループ用変数
     int a[5] = {1,2,3};     //配列の宣言と初期化処理
     //配列の要素数よりも少ない場合、残りにはすべて0が代入される。
     for(i=0;i<5;i++){                   //5回ループ
         printf("a[%d]=%d\n",i,a[i]);    //aの配列の値を出力
     }
     
 #if 0
     //配列は宣言の時以外で、1度に複数の値を代入することはできない。
     //下記bを有効にすると、エラーになる。
     int b[3];
     b[3] = {1,2,3}
 #endif
 
     //宣言の時の要素数の省略
     int c[]={4,5,6};                    //宣言の時に要素数を省略できる。
     for(i=0;i<=2;i++){                  //3回ループ
         printf("c[%d]=%d\n",i,c[i]);    //aの配列の値を出力
     }
 }

結果:https://paiza.io/projects/S695zS_FukH1xz6NXPMGQQ?language=c

4.プログラム説明

 (1) int a[5] = {1,2,3};

  aという変数の配列をint型で宣言している。

  1,2,3を初期値として、a[0],a[1],a[2]に代入している。

  a[3],a[4]は、0の値が入る。

  配列では、最初の宣言の時にのみ、複数の値を設定できる。

  そのため、下記書き方はできないので注意する。

  a[5] = {1,2,3} 

 

 (2)  for(i=0;i<5;i++){ }部分

  forの繰り返しで、iを0から5まで繰り返す。

  配列の要素をiにすることによって、a[0]~a[4]の数値を呼び出している。

 

 (3) #if 0

  コメントのように、処理を動作しないようにしている。

  上記プログラムでは、#if から#endifまでは、処理が反映されないようになっている。

  #if 0を#if 1にすると、処理が反映されるようになる。

  コメントだと/* */を使う場合、/* /* コメント*/ */ のような使い方ができない。

  また、0と1を変えるだけで、処理のON/OFFが出来るので、便利。

 

 (4) int c[]={4,5,6}; 

  これも、配列の宣言と初期化をしている。

  要素数を省略することができる。

  ただ、a[5]のように、c[3],c[4]には、0は入らない。

 

5.プログラム作成2(配列の要素数の求め方)

 配列の要素数の求め方 

#include <stdio.h>
  int main(void){
      // Your code here!
      //要素数を求める。
      //変数の宣言
       int a[] = {7,8,9};     //配列を宣言
       int i;                 //ループ用変数
       
       //sizeof:データ型の大きさを求める単項の演算子
       int b = sizeof(a);     //配列a(全ての合計)のデータの大きさを求める。
       int c = sizeof(a[0]);  //配列1個当たり(a[0])のデータの大きさを求める。
       int d = b/c;           //配列の要素数を求める。
       //int は4byte
       
       printf("配列a(全ての合計)のデータの大きさ:%d\n",b);
       printf("配列1個当たり(a[0])のデータの大きさ:%d\n",c);
       printf("配列aの要素数:%d\n",d);
       
       for(i=0;i<d;i++){  //要素数の数だけループする。
            printf("a[%d]=%d\n",i,a[i]);     //配列aの値を列挙する。
       }
  }

実行結果:https://paiza.io/projects/9_CqzTWx_0MlYAB8XeI0pg?language=c

 

参考:

配列の使い方 - 苦しんで覚えるC言語

C初級:文字配列での2次元配列イメージ | 電脳産物

 

6.プログラム作成(2重配列)

#include <stdio.h>
 
 int main(void){
     // Your code here!
     //変数の宣言
     int i,j;
     //宣言方法: 型 変数名[要素数1][要素数2] = {"要素1","要素2",・・・} //文字列の場合
      char a[3][5] = {"12345","TEST2","TEST3"}; 
      char b[3][7] = {"12345","TEST2","TEST3"};
     //宣言方法: 型 変数名[要素数1][要素数2] = {{要素1_1,要素1_2,・・・},{要素2_1,要素2_2・・・},・・・} 
     //数値の場合
      int  c[2][4] = {{1,2,3,4},{5,6,7,8}};
 
      //sizeof:データ型の大きさを求める単項の演算子
      int size_a = sizeof(a);      //配列a(全ての合計)のデータの大きさを求める。
      int size_a0 = sizeof(a[0]); //配列1個当たり(a[0])のデータの大きさを求める。
      int size_num = size_a/size_a0;      //配列の要素数を求める。
      
      printf("配列a(全ての合計)のデータの大きさ:%d\n",size_a);
      printf("配列1個当たり(a[0])のデータの大きさ:%d\n",size_a0);
      printf("配列aの要素数:%d\n",size_num);
      
      size_a = sizeof(b);        //配列b(全ての合計)のデータの大きさを求める。
      size_a0 = sizeof(b[0]);     //配列1個当たり(b[0])のデータの大きさを求める。
      size_num = size_a/size_a0;             //配列の要素数を求める。
      printf("配列b(全ての合計)のデータの大きさ:%d\n",size_a);
      printf("配列1個当たり(b[0])のデータの大きさ:%d\n",size_a0);
      printf("配列bの要素数:%d\n",size_num);
 
     for(i=0;i<3;i++){
     //文字列(char型配列)の末尾には、NULL文字'\0'があるため、データの大きさが5だと足りていない。
         printf("a[%d]=%s\n",i,a[i]);            //配列aの値を出力
         //printf("a[%d]=%s\n",i,a[i][0]);       //これはエラー
         printf("b[%d]=%s\n",i,b[i]);            //配列bの値を出力
         
 #if 1   //printfが見にくかったら0に変更
         for(j=0;j<6;j++){
         printf("a[%d][%d]=%c\n",i,j,a[i][j]);   //配列aの[i][1]番目の文字を出力
         printf("b[%d][%d]=%c\n",i,j,b[i][j]);   //配列aの[i][1]番目の文字を出力
         //printf("a[%d][%d]=%c\n",i,j,a[i][5]);  //配列aの[i][1]番目の文字を出力
         }
 #endif
     }
     
     //printf("c=%d\n",c);           //これはエラー
     printf("c=%d\n\n",c[0][0]);     //[0][0]の場所:1を出力
     for(i=0;i<2;i++){
         for(j=0;j<4;j++){
             printf("c[%d][%d]=%d\n",i,j,c[i][j]);     //cの値を出力
         }
     }
 }

実行結果:https://paiza.io/projects/f0YxurQ76fThDCkR4ILWmA?language=c

 

7.プログラム作成(2重配列の確認、要素の省略)

#include <stdio.h>
 
 int main(void){
     // Your code here!
     //要素数を求める。
     //変数の宣言
      //char a[] = "TEST";     //配列を宣言 1次元確認用
      // char a[][] = {"TEST1","TEST2","TEST3"}; //これはエラーになる。
      char a[][5] = {"TEST1","TEST2","TEST3"};
      char b[][6] = {"TEST1","TEST2","TEST3"};
 
      //sizeof:データ型の大きさを求める単項の演算子
      int size_a = sizeof(a);      //配列a(全ての合計)のデータの大きさを求める。
      int size_a0 = sizeof(a[0]); //配列1個当たり(a[0])のデータの大きさを求める。
      int size_num = size_a/size_a0;         //配列の要素数を求める。
      
      printf("配列a(全ての合計)のデータの大きさ:%d\n",size_a);
      printf("配列1個当たり(a[0])のデータの大きさ:%d\n",size_a0);
      printf("配列aの要素数:%d\n",size_num);
      
      size_a = sizeof(b);        //配列b(全ての合計)のデータの大きさを求める。
      size_a0 = sizeof(b[0]);   //配列1個当たり(a[0])のデータの大きさを求める。
      size_num = size_a/size_a0;             //配列の要素数を求める。
      printf("配列b(全ての合計)のデータの大きさ:%d\n",size_a);
      printf("配列1個当たり(b[0])のデータの大きさ:%d\n",size_a0);
      printf("配列bの要素数:%d\n",size_num);
 
     printf("a=%s\n",a);     //配列aの値を出力
     printf("b=%s\n",b);     //配列bの値を出力
    // printf("x=%s",x);
 } 

実行結果:https://paiza.io/projects/nIsKPefvDhHnHdWxd4E18Q?language=c

参考:

多次元配列 - 配列 - C言語 入門

【C言語】配列を引数として渡すことの考察(2次元配列まで) - Qiita

 

8.プログラム作成(関数で要素数を算出する(できない))

 要素数を関数で求める場合、

 引数の型のバイト数が要素数として返ってきてしまうため、

 通常の関数を作成する方法では、要素数を求めることはできない。

#include <stdio.h>

//要素数を求めるプログラム
void Elm1(int *num);

int main(void){
    // Your code here!
    //変数の宣言
     int a[] = {2,4,5,6};

     //sizeof:データ型の大きさを求める単項の演算子
     int b = sizeof(a);     //配列a(全ての合計)のデータの大きさを求める。
     int c = sizeof(a[0]);  //配列1個当たり(a[0])のデータの大きさを求める。
     int d = b/c;           //配列の要素数を求める。
     
     //要素数を求める。
     Elm1(a);   //関数を使用して要素数を算出(したいが・・・)
     printf("配列aの要素数:%d\n",d);
}


//要素数を求める関数
void Elm1(int *num){
    int numsizeall;
    int numsizeone;
    int numelm;
    
    numsizeall  = sizeof(num);
    numsizeone  = sizeof(num[0]);
    numelm      = numsizeall/numsizeone;
    printf("配列aの要素数(Elm1):%d\n",numelm);
}

実行結果:https://paiza.io/projects/NBxuj8E29KLOfQlZJEvtrQ?language=c

 

9.プログラム作成(関数の引数に配列を使用する)

※配列の要素は、関数で求めることはできないが。

 配列を関数に渡すことは、ポインタを使用すれば出来る。

 配列を引数として、関数に渡して、その値を確認するプログラム。

#include <stdio.h>

void Elm1(int *num);

int main(void){
    // Your code here!
    //要素数を求める。
    //変数の宣言
     //char a[] = "TEST";     //配列を宣言
     int a[] = {2,4,5};
     Elm1(a);

#if 1   
     //sizeof:データ型の大きさを求める単項の演算子
     int b = sizeof(a);     //配列a(全ての合計)のデータの大きさを求める。
     int c = sizeof(a[0]);  //配列1個当たり(a[0])のデータの大きさを求める。
     int d = b/c;           //配列の要素数を求める。
     printf("\n"); //改行
     printf("配列a(全ての合計)のデータの大きさ:%d\n",b);
     printf("配列1個当たり(a[0])のデータの大きさ:%d\n",c);
     printf("配列aの要素数:%d\n",d);
     //printf("a=%s\n",a);     //配列aの値を列挙する。
#endif
}


//要素数を求める関数
void Elm1(int *num){
    int numsizeall;
    int numsizeone;
    int numelm;
    
    numsizeall  = sizeof(num);
    numsizeone  = sizeof(num[0]);
    numelm      = numsizeall/numsizeone;
    printf("関数Elm1の出力:num[0]=%d\n",num[0]);     //配列aの値を列挙する。
    printf("関数Elm1の出力:num[1]=%d\n",num[1]);     //配列aの値を列挙する
    printf("関数Elm1の出力:num[2]=%d\n",num[2]);     //配列aの値を列挙する
    printf("配列a(全ての合計)のデータの大きさ:%d\n",numsizeall);
    printf("配列1個当たり(a[0])のデータの大きさ:%d\n",numsizeone);
    printf("配列aの要素数:%d\n",numelm);
}

実行結果:https://paiza.io/projects/QEwq7WOqq85QlhQxLohTRw?language=c

参考:配列の要素数を求める | Programming Place Plus C言語編 逆引き

 

関連記事

記事一覧:

C言語

組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary

C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary

C言語基礎知識3(配列) - Project_OKI’s diary

C言語基礎知識4(if文) - Project_OKI’s diary

C言語基礎知識5(switch文) - Project_OKI’s diary

知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - Project_OKI’s diary

組み込みC言語基礎知識6(関数) - Project_OKI’s diary

組み込みC言語基礎知識7(構造体1) - Project_OKI’s diary

 

参考

dotinstall.com