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

マックス


「今、生成した17次元配列にはどれくらいの数の数値データが格納されてるのか?


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


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


配列を初期化するための数値データにを格納するいれものの形が


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


strlen関数は配列内に格納された数値データの数を


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


(統合開発環境EAZY IDECの場合のみstrlen関数は1次元配列内に格納された数値データの数だけなら正確に数え上げることができます)」


マックス 「そうか


なら今度は


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[]={1,2,3,4,5};


により


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


sizeof演算子


で調べてみる。


int hairetu[]={1,2,3,4,5};


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


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


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


要素数=生成されるint型の配列変数の総数が自動的に5に決められる


そして


(要素数=生成されるint型の配列変数)×4(バイト)


int型の 配列hairetuのデータ総格納容量(バイト数)となる


ということは


sizeof演算子をつかって


この


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


int型の配列hairetuのデータ総格納容量(バイト数)÷4


=配列に格納される数値データの数(配列変数の総数)



となるわけだ  そうだろう


ただ


int hairetu[100];


のように[ ]の中で100が記述された状態で


int型の配列宣言


が行われた場合


配列のデータ総格納容量(バイト数)は


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


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


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


400÷4を行っても


正確には


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


配列のデータ総格納容量(バイト数)は


400バイトでも


配列内に格納される数値データは1個(4バイト)だけかもしれないからな


sizeof演算子をつかって


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


な、てんC


int hairetu[]={1,2,3,4,5};


によって生成される配列のデータ総格納容量(バイト数)は


確実に


格納される数値データの数×4


を表すことになるから


配列のデータ総格納容量(バイト数)÷4


を行えば


格納される数値データの数を求めることができるってわけだ」


てん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;

}


EAZY IDECの場合

コンパイル結果


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



Visual Studioの場合

ビルド実行結果


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


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


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


つまり


hairetuのデータ総格納容量(8バイト)÷(1つの配列変数のデータ格納容量)(4バイト)=2


より


2つの数値データが


int型配列 hairetuに格納されていることがわかる


実際に


int hairetu[]={1,2};


をみると


2つの数値データが配列hairetuに格納されているのが


もろにわかる


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


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


次はint型2次元配列宣言


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;

}


Visual Studioの場合


エラー (アクティブ) E0098 配列にこの型の要素があってはなりません

エラー C2078 初期化子の数が多すぎます

エラー C2087 'hairetu': 添字がありません。



EAZY IDECの場合

コンパイル結果


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


マックス「


やはり


Visual Studioの場合はビルドエラーか・・・


しかし


EAZY IDECの場合は


ピンポ~ん


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


となっていることから


hairetuのデータ総格納容量(72バイト)÷(1つの配列変数のデータ格納容量)(4バイト)=18


つまり


18個の数値データが


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


実際に


int hairetu[][]=

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


を観察すると18個の数値データが格納されている


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



てんC「では


int型の3次元配列宣言


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;

}


Visual Studioの場合


エラー (アクティブ) E0098 配列にこの型の要素があってはなりません

エラー C2078 初期化子の数が多すぎます。

エラー C2070 'int [][][]': sizeof オペランドが正しくありません。

エラー C2087 'hairetu': 添字がありません。



EAZY IDECの場合

コンパイル結果


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



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


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


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


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


つまり


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


24個の数値がint型3次元配列hairetuに格納されているはずだ~


ははは~(*´▽`*)


実際に


int型の3次元配列宣言、初期化

👇

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個の数値データが格納されている


このint型3次元配列宣言、初期化


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}}};


のように


初期化するときの[][][]の中の要素数が定められないタイプの配列に


sizeof演算子をつかえば


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


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


だから


数値データを格納した時の配列の総格納容量(バイト)÷4(1つの配列変数のデータ格納容量)を


行うことによって


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



(ただし EAZY IDECの場合のみです)


これで


ようやく


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


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


てんC 「はい


 🐟🐟...


🐟🐟...

🐟🐟...


お魚さんも喜んでいます


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


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


🐟🐟...    🐟🐟... 」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る