
はじめまして。
C言語の初学者です。
sizeof(サイズオブ)演算子の理解でつまづいています。
参考書の説明は下記の通りです。
要素数を数えるのは面倒くさいので、要素数を自動的に求めて繰り返させることにします。
要素数を求める直接的な方法は用意されていませんが、計算することは出来ます。
配列全体のサイズを求め、それを要素1つのサイズで割れば要素の数がわかります。
C言語には、変数や配列のサイズを求めるsizeof(サイズオブ)演算子があります。
sizeof演算子は、次のようにして使います。
sizeof(変数や配列名)
sizeof演算子には()をつけなくても良いのですが、つけた方が読みやすいでしょう。
この演算子を使って配列arrayの要素数を求めるには次のようにします。
sizeof(array) / sizeof(array[0])
上記の説明文にある、【配列全体のサイズ】と【要素1つのサイズ】の【サイズ】とは何を指しているのでしょうか。
また、上記の【sizeof(array) / sizeof(array[0])】の割り算の意味が分かりません。
下記のプログラムを例にして、具体的に何を何で割っているのか数字を当てはめて教えてください。
よろしくお願い致します。
#include <stdio.h>
int main(void)
{
int array[] = {42,79,13,75,19};
int i;
for (i = 0;i < sizeof(array) / sizeof(array[0]);i++) {
printf("array[%d] = %d\n",i,array[i]);
}
return 0;
}
このプログラムの実行結果は次の通りになります。
array[0] = 42
array[1] = 79
array[2] = 13
array[3] = 75
array[4] = 19
No.1ベストアンサー
- 回答日時:
サイズとはバイト数ですね。
intが4バイトの処理系だと、arrayは20バイト確保されます。すると、sizeof(array)は20、sizeof(array[0])はsizeof(int)と同じなので4です。sizeof(array)/sizeof(array[0])は20/4で5となり、配列の要素数と一致します。
この回答への補足
ご回答いただき、ありがとうございました。
【intが4バイトの処理系だと、arrayは20バイト確保されます。】と教えていただきましたが、arrayのサイズ20は、あらかじめ要素数が5と分かった上で、4バイト×要素数5=20バイトと計算しているのでしょうか。
もしそうなら、答えが5とわかっているのに、【sizeof(array)/sizeof(array[0])は20/4で5となり】というように後から割り算して要素数が5であると計算する意味がないのではと思いました(素人の素朴な疑問として)。
なぜ、【arrayは20バイト確保されます】となるのか詳しく教えてください。
よろしくお願い致します。
No.5
- 回答日時:
わざわざ組み込みの型と構造体型を区別する必然性が理解できません>#2.
「メモリを動的に確保する」場面であれば組み込み型だろうと構造体型だろうと sizeof のお世話にならざるを得ないし, あらかじめ配列の要素数の最大値が分かっているなら逆にどちらであっても sizeof など不要.
余談ですが, 個人的には配列であることがわかっているなら, その要素数は常に sizeof array/sizeof array[0] のようにとるべきだと思います. こう書けば, (array が配列として定義されている限り) 常に正しい値になりますし, ここを見ただけで「array の要素数」であることが明確ですからね.
No.4
- 回答日時:
パソコンが要素の数を記憶する、即ち、プログラムを実行する度に自動的に要素の数が判定される、という訳ではありません。
このソースコードをコンパイルする、いくつかの処理の過程で、sizeof( … ) で記述された部分は、それに該当する変数の要素数を計算して、適当な値に差し替えられます。
for i = 0 to i < sizeof(…
という記述は、
for i = 0 to 5
になって、ここから実行型のプログラムが作られていきますので、プログラムを実行する段階では既に決まっているということになります。
明示的に、#define MAX 5
などとした時も、これを5から10とかに変更すると、ソースコード上、 for i = 0 to MAX と記述されている部分が、 for i = 0 to 10 と変更されてコンパイルされますが、sizeof を使ってもこれと同じことが行われます。
要は、define文 などで定義した 常数(Const) も sizeof() も コンパイル時に常数として処理されて、実行形式のプログラムになります。
ご参考に。
No.3
- 回答日時:
要素の数は、コンパイル時にすでに決まっているので、わざわざsizeof(array)/sizeof(array[0])という計算をする必要はありません。
しかし、この部分を固定値で5としていると、要素個数を増減する場合にarrayの初期化部分を直すのと同時に、for文の判断部分も直す必要があります。sizeofを使って計算させていれば、初期化部分を直すだけで、自動的に全要素に対してfor文がループしてくれます。
sizeofはコンパイル時に要素のサイズに置き換わるので、直接要素数を記述したのと出来上がるバイナリは同じになり、効率が下がるということもありません。
No.2
- 回答日時:
配列全体のサイズとは、 要素の数 × 要素のサイズ という意味になります。
要素のサイズは、バイト数と思ってよいです。なので、配列全体のサイズも全体のバイト数ということになります。
質問者殿のサンプルコードの例では、配列 array[] は、int型で、要素が、42、79,13,75,19の5個の配列ということになります。
一個の要素 即ち array[0] (要素は0番目でなくても良いですが) のサイズで、配列全体のサイズを割れば、要素の数が分かるということになります。
sizeof(array) / sizeof(arrya[0]) は、5ですね。
あとは、for 文 で、 i = 0 から i < 5 まで、各要素の内容を表示する、という構造になっています。
蛇足ですが、
int や、char の配列などでは、あまり積極的に使わなくても、配列の最大を先に定義してしまえば、sizeofなどを使わなくてもいいです。
#difein MAX 5
int array[ MAX ];
などの様に。この方が、後々コーディングし易いはずです。
sizeof が有効(というより有り難い存在)なのは、構造体や、構造体配列の時などでしょうね。恐らく、今後構造体などを学んで行くと、この有り難さが良く理解出来てくるかと思います。(定義した構造体配列のメモリ領域を確保する、など)
ご参考に。
この回答への補足
ご回答いただき、ありがとうございました。
【配列全体のサイズとは、 要素の数 × 要素のサイズ】と教えていただきましたが、パソコンが【int array[] = {42,79,13,75,19}】というプログラムの記述から要素の数を自動で5であると認識し、要素のサイズを掛けて配列全体のサイズを記憶しているのでしょうか。
教えていただきたく、お願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- その他(プログラミング・Web制作) listへのappendが出来ない件 1 2022/12/06 21:44
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- C言語・C++・C# c言語について array[i]-‘0’ これってどーゆー意味ですか? (ちなみに16進数を10進数 5 2022/12/06 18:39
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C言語】全角文字の配列を、全...
-
gccを行ってもexeファイルが生...
-
visual studio 2022でのC#プロ...
-
いまc言語を独学で勉強している...
-
C言語 列挙型(enum型)変数について
-
大量のデータを読み込んで表示...
-
C言語の関数のextern宣言
-
VisualStudio2022でC言語プログ...
-
終端記号、非終端記号とは
-
VisualStudioでC++クラスを追加...
-
c言語でイベントフラグを使った...
-
プログラミング 2つの整数を読...
-
UART通信の取説で,left floati...
-
Notepad++の関数リスト表示の変...
-
c言語
-
VisualStudioで、コードを印刷...
-
pythonの質問です。
-
C++でデスクトップGUIアプリ開...
-
c#のTLS1.2での通信について
-
写真のプログラムは、1からnま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の要素番号を取得するには?
-
VB.NET の配列の要素数
-
重複しない乱数の生成
-
Vba 配列の中の特定文字列の位...
-
IDの自動採番について
-
VBでボタンを押すと画像をラン...
-
変な質問ですみません、n番目の...
-
ActionScript3で乱数を取得しな...
-
[Objective-c]多次元配列のアク...
-
データ構造のテキスト保存につ...
-
複数の変数宣言を、for文で一気...
-
重複しない乱数を作り配列に入...
-
配列操作
-
String.prototype.split2d 理...
-
ユーザー定義関数が呼び出せない
-
Action Script 2.0 配列の比較
-
【ActionScript】配列の昇順降...
-
ActionScriptで配列をクリアす...
-
VB6 複数行のテキストをリスト...
-
アクションスクリプト for~in時
おすすめ情報