おまけのコーナー 文字列データでなく数値データを格納した配列の格納容量を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 「はい
🐟🐟...
🐟🐟...
🐟🐟...
お魚さんも喜んでいます
マックスにゃんこ😼さん💖」
マックス「にゃっ にゃおおおおん
🐟🐟... 🐟🐟... 」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます