おまけのコーナー 文字列でなく数値を格納した配列の格納容量をsizeof演算子で調べる

マックス

「17次元配列にはどれくらいの数の数値が格納されてるのか?


strlen関数で数え上げるのは無理っぽい・・」


てんC「そうですね。なぜか次元が拡張すると


配列を初期化するための数値のいれものの形が


複雑になるからなのかはわかりませんが


strlen関数で配列内に格納された数値の数を


正確に数え上げることはできないようですね。」


マックス 「そうか


なら今度は


sizeof演算子をもちいて


配列の格納容量(バイト数)を調べる方法をつかって


配列にどのくらいの数の数値が格納されているか


間接的に計算してみようじゃないか


そうしようじゃないか? てんC


sizeof演算子をつかってint型配列の総格納容量(バイト数)がわかれば


int型配列では


4バイトあたりに1つの整数値が格納されているので


int型配列の総格納容量(バイト数)÷4を実行すれば


int型配列の中に格納されている数値の総数もわかるって、


そうだろう、てんC?」


てんC「はい(^^)、そのとおりですね。」


マックス「そこで


int型配列hairetuの総格納容量(バイト数)を調べるわけだが


int型配列宣言


int hairetu[100]={ };


によって作成された


配列は


格納される数値の数に関係なく


[100]のなかの要素数100により


100×4バイト=400バイトと


配列の総格納容量が決定されるだろう?


この


int hairetu[100]={ };


のようにすでに要素数が決まっているタイプの配列宣言によって


作成された配列ではなく


格納される数値の数によって


自動的にint型配列 hairetu[]の[]の中の要素数が設定される


[]の中の要素数が無記入の


👇このタイプのint型配列宣言


int hairetu[]={ };


で配列宣言、初期化された配列hairetuの総格納容量(バイト数)を


sizeof演算子


で調べてみる。


int hairetu[]={ };


の{}内に数値が格納されると


その数値を格納するために


配列に格納される数値の数=要素数


要素数=配列変数の総数が自動的に決められる


そして


(要素数=配列変数の総数)×4


配列hairetuの総格納容量(バイト数)となる


ということは


sizeof演算子をつかって


配列hairetuの総格納容量(バイト数)をもとめることができれば


配列hairetuの総格納容量(バイト数)÷4=(要素数=配列変数の総数)


=配列に格納される数値の数


となるわけだ  そうだろう


int hairetu[100]={};


が行われた場合の配列の総格納容量(バイト数)は


格納される数値の数に関係なく


(要素数=生成される配列変数の総数)×4=


400バイトにきまっているから


配列に格納される数値の数を求めることはできないだろう


sizeof演算子をつかって


総格納容量(バイト数)をしらべてもしょうがないっと(^o^)丿


な、てんC」


てんC「そのとおりです マックスさん」


マックス「それでは


まずは

配列宣言

int hairetu[]={1,2};

によって作成される

1次元配列hairetuの総格納容量(バイト数)を


sizeof演算子をつかって調べてみよう。


#include <stdio.h>


int main(void)

{

int hairetu[]={1,2};

printf("hairetuの総格納容量は%dバイトです \n",sizeof(hairetu));

return 0;

}


コンパイル結果


hairetuの総格納容量は8バイトです



マックス 「ビンゴっ てんCさん


hairetuの総格納容量は8バイトです


つまり


hairetuの総格納容量(8バイト)÷4は=2


2つの数値が


int型配列 hairetuに格納されている


実際に


int hairetu[]={1,2};


と2つの数値が格納されている


幸先いいじゃないか~~~💖💖💖」


てんC「やりましたね😊 マックスさん。


次は2次元int型配列宣言


int hairetu[][]=

{{2,3,4},{8,8,8},{3,8,2},{7,1,0},{3,2,4},{6,3,0}};

 

によって作成される配列hairetuの総格納容量(バイト数)を


sizeof演算子を使って調べてみます。


#include <stdio.h>


int main(void)

{

int hairetu[][]=

{{2,3,4},{8,8,8},{3,8,2},{7,1,0},{3,2,4},{6,3,0}};

printf("hairetuの総格納容量は%dバイトです \n",sizeof(hairetu));

return 0;

}


コンパイル結果


hairetuの総格納容量は72バイトです


マックス「ピンポ~ん


hairetuの総格納容量は72バイトです


つまり


hairetuの総格納容量(72バイト)÷4は=18


18個の数値が


2次元int型配列 hairetuに格納されているはず。


実際に


int hairetu[][]=

{{2,3,4},{8,8,8},{3,8,2},{7,1,0},{3,2,4},{6,3,0}};


と18個の数値が格納されている


いいじゃないか この結果😊」



てんC「では


3次元int型配列宣言


int hairetu[][][]=

{{{2,3,4,5},{8,8,8,7},{3,8,2,8}},{{7,1,0,8},{3,2,4,5},{6,3,0,8}}};


によって作成される配列hairetuの総格納容量(バイト数)は


どうなるかsizeof演算子をつかって調べてみます。」


では プログラムを構成し・・・


コンパイルしてみます マックスさん


#include <stdio.h>


int main(void)

{

int hairetu[][][]=

{{{2,3,4,5},{8,8,8,7},{3,8,2,8}},{{7,1,0,8},{3,2,4,5},{6,3,0,8}}};

printf("hairetuの総格納容量は%dバイトです \n",sizeof(hairetu));

return 0;

}


コンパイル結果


hairetuの総格納容量は96バイトです



マックス 「来た、間違いないぃぃぃ(´▽`*)はあ はあ(´▽`)


 いえええええぇぇぇぇぇぃぃぃぃ


魚うぉぉぉぉぉぉ~~~~~🐟🐟🐟ぴっちぴっち


hairetuの総格納容量は96バイトです


つまり


hairetuの総格納容量(96バイト)÷4は=24


24個の数値が


3次元int型配列 hairetuに格納されているはずだ~


ははは~(*´▽`*)


実際に


配列宣言、初期化では


int hairetu[][][]=

{{{2,3,4,5},{8,8,8,7},{3,8,2,8}},{{7,1,0,8},{3,2,4,5},{6,3,0,8}}};


と24個の数値が格納されている


このように


sizeof演算子をつかえば


2次元以上の配列の中に


数値を格納した時の配列の総格納容量(バイト)を


printf出力表示することができる、


そう


つまり


数値を格納した時の配列の総格納容量(バイト)÷4を


行うことによって


配列内に格納している数値の数がわかるというわけなんだなぁぁぁ


これで


ようやく17次元配列に格納されている数値の数を数え上げることができる。


ふ~~~やったにゃん、な、てんC」


てんC 「はい

 🐟🐟...


🐟🐟...

🐟🐟...


ですよ


マックスにゃんこ😼さん💖」


マックス「にゃっ にゃおおおおん


🐟🐟...    🐟🐟... 」


  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます