Project_OKI’s diary

エンジニアの勉強ブログ

C言語基礎知識40(配列の要素数算出)

配列の要素数算出方法

この記事では、配列の要素数を算出する方法について記載する。

 

配列に関しては下記記事を参照

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

 

1. 目的

 ・配列の要素数を算出する方法について理解する。

 ・配列の要素数を算出する簡易関数を作成する。

 

目次

 

2. 要素数の算出方法

 ・1次配列の要素数の算出方法

 配列の要素数 = 配列の全体のデータサイズ/配列1個当たりのデータサイズ

 配列全体のデータサイズ = sizeof(配列);

 配列1個当たりのデータサイズ = sizeof(配列0番目

 

例:

       int a[] = {7,8,9};     //配列を宣言

       //sizeof:データ型の大きさを求める単項の演算子
       int b = sizeof(a);     //配列a(全ての合計)のデータの大きさを求める。
       int c = sizeof(a[0]);  //配列1個当たり(a[0])のデータの大きさを求める。
       int d = b/c;           //配列の要素数を求める。

 

3. プログラムの作成(1次元配列の要素算出)

#include <stdio.h>
int main(void){
    //要素数を求める。
    //配列の宣言
     int array[] = {1,2,3};             //配列を宣言
     
     //sizeof:データ型の大きさを求める単項の演算子
     int arraysize = sizeof(array);     //配列array(全ての合計)のデータの大きさを求める。
     int array0size = sizeof(array[0]); //配列1個当たり(array[0])のデータの大きさを求める。
     int elm = arraysize/array0size;    //配列の要素数を求める。
     
     //値の出力
     printf("配列arrya(全ての合計)のデータの大きさ:%d\n",arraysize);
     printf("配列1個当たり(array[0])のデータの大きさ:%d\n",array0size);
     printf("配列arrayの要素数:%d\n",elm);
}

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

 

 今回は、int型の配列を作成している為、この配列1個のデータの大きさは、

 int型つまり、4byteとなる。 (byte数は、環境によって変動する。)

 それが、3つあるので、配列のサイズとしては、12となった。

 そのため、12/4となり、要素数は3と求められる。

 

4.プログラム作成(#defineで要素数を算出する)

 配列の要素数を算出しようとした場合、関数では算出が出来ない。

 →理由については下記ブログ参照

 そのため、#define で要素数を算出する簡易関数を作成する。

#include <stdio.h>

// 要素数を算出する簡易関数の作成
#define Elm(d) sizeof(d)/sizeof(d[0])

int main(void){
    //要素数を求める。
    //配列の宣言
    int array[] = {1,2,3,4};             //配列を宣言
    //関数を使用して、要素数を算出     
    int elm = Elm(array);
    //値の出力
    printf("配列arrayの要素数:%d\n",elm);
}

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

 このように、#defineを使用すれば、配列の要素数を算出する関数を作成できる。

 #defineについては下記記事を参照

 →C言語基礎知識11(#define) - Project_OKI’s diary

 

5. プログラム作成(2重配列のサイズ確認)

#include <stdio.h>

// 要素数を算出する簡易関数の作成
#define Elm(d) sizeof(d)/sizeof(d[0])

int main(void){
    //要素数を求める。
    //配列の宣言
    int array[][10] = 
    {{1,2,3},
     {1,2}};
    
    int arraysize = sizeof(array);          //int 10×2個分(4×10×2バイト)
    int array0size = sizeof(array[0]);      //int 10個分(4×10バイト)
    int array00size = sizeof(array[0][0]);  //int 1個分(4バイト)  
    
    //関数を使用して、要素数を算出     
    int elm = Elm(array);
    //値の出力
    printf("配列arrayのサイズ:%d\n",arraysize);
    printf("配列array[0]のサイズ:%d\n",array0size);
    printf("配列array[0][0]のサイズ:%d\n",array00size);
    printf("配列arrayの要素数:%d\n",elm);
}

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

配列arrayのサイズ:80個
配列array[0]のサイズ:40個
配列array[0][0]のサイズ:4個
配列arrayの要素数:2個

 ・以上の事から、多次元配列だと、arrayの要素数は取得できるが、

 {1,2,3}や、 {1,2}など、内部の配列の要素数を算出する事はできない。

 

もしも、内部の配列の要素数を算出したい場合、多次元配列ではできない為、

配列ポインタを使用して行う。

 

6. プログラム作成(配列ポインタを使用した要素数の取得)

・array1,array2の配列を用意する。

・その2つの配列をarraysumのポインタ配列に格納し、それぞれの配列の要素数を取得する。

#include <stdio.h>

// 要素数を算出する簡易関数の作成
#define Elm(d) sizeof(d)/sizeof(d[0])

int main(void){
    //要素数を求める。
    //配列の宣言
    int array1[] = {1,2,3};
    int array2[] = {1,2,3,4};
    
    int *arraysum[]={
        array1,
        array2
    };
    
    int arraysize = sizeof(arraysum);          //int 10×2個分(4×10×2バイト)
    int array0size = sizeof(arraysum[0]);      //int 10個分(4×10バイト)
    //サイズの出力
    printf("配列arrayのサイズ:%d\n",arraysize);
    printf("配列array[0]のサイズ:%d\n",array0size);
    
    //要素数の取得
    int Array1Elm = Elm(array1);
    int Array2Elm = Elm(array2);
    int ArraySumElm = Elm(arraysum);
    //要素数の出力
    printf("配列array1の要素数:%d\n",Array1Elm);
    printf("配列array2の要素数:%d\n",Array2Elm);
    printf("配列arraysumの要素数:%d\n",ArraySumElm);
}

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

配列arrayのサイズ:16個
配列array[0]のサイズ:8個
配列array1の要素数:3個
配列array2の要素数:4個
配列arraysumの要素数:2個

 

 ・以上の結果より、配列ポインタを使用することによって、5.二重配列では、取得できなかった、中の要素array1とarray2をそれぞれ取得できる。

  ただ、arraysumからarray1とarray2の要素を取得できる訳ではない。

 

7. プログラム作成(配列ポインタの値を出力)

#include <stdio.h>

// 要素数を算出する簡易関数の作成
#define Elm(d) sizeof(d)/sizeof(d[0])
#define ARRAYSUMELMMAX 10

int main(void){
    //配列の宣言
    int array1[] = {1,2,3};
    int array2[] = {2,3,4,5};
    
    int *arraysum[]={
        array1,
        array2
    };
    //それぞれの配列の要素数を格納する配列。
    int setElm[ARRAYSUMELMMAX] = {
        Elm(array1),
        Elm(array2)
    };
    //arraysumの要素数の取得
    int ArraySumElm = Elm(arraysum);

    //格納されている配列の値を出力
    for(int i=0;i<ArraySumElm;i++){     ///arraysumの配列の要素数分ループ
        for(int j=0;j<setElm[i];j++){
            printf("arraysum[%d][%d]=%d\n",i,j,arraysum[i][j]);
        }
    }
}

実行結果:https://paiza.io/projects/uibn38RNX2dGx86Eim8-AA?language=c

arraysum[0][0]=1
arraysum[0][1]=2
arraysum[0][2]=3
arraysum[1][0]=2
arraysum[1][1]=3
arraysum[1][2]=4
arraysum[1][3]=5

 ・以上のように、それぞれの要素を取得し、配列の中の値を出力した。

 

・参考記事:aDLcme - Online C Compiler & Debugging Tool - Ideone.com

 

 

組み込みC言語