配列の要素数算出方法
この記事では、配列の要素数を算出する方法について記載する。
配列に関しては下記記事を参照
→・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の要素数は取得できるが、
{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
・以上の結果より、配列ポインタを使用することによって、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][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言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - Project_OKI’s diary
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary