• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語のsizeof(サイズオブ)演算子について)

C言語のsizeof(サイズオブ)演算子について

このQ&Aのポイント
  • C言語のsizeof演算子についての疑問や理解につまづく点について説明します。
  • sizeof演算子を使って配列の要素数を求める方法について具体的なプログラム例を交えて解説します。
  • 配列全体のサイズと要素1つのサイズを利用して配列の要素数を計算する方法を説明します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

サイズとはバイト数ですね。 intが4バイトの処理系だと、arrayは20バイト確保されます。すると、sizeof(array)は20、sizeof(array[0])はsizeof(int)と同じなので4です。sizeof(array)/sizeof(array[0])は20/4で5となり、配列の要素数と一致します。

501xx
質問者

お礼

丁寧に教えていただき、ありがとうございました。 すっきりとしました。

501xx
質問者

補足

ご回答いただき、ありがとうございました。 【intが4バイトの処理系だと、arrayは20バイト確保されます。】と教えていただきましたが、arrayのサイズ20は、あらかじめ要素数が5と分かった上で、4バイト×要素数5=20バイトと計算しているのでしょうか。 もしそうなら、答えが5とわかっているのに、【sizeof(array)/sizeof(array[0])は20/4で5となり】というように後から割り算して要素数が5であると計算する意味がないのではと思いました(素人の素朴な疑問として)。 なぜ、【arrayは20バイト確保されます】となるのか詳しく教えてください。 よろしくお願い致します。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

わざわざ組み込みの型と構造体型を区別する必然性が理解できません>#2. 「メモリを動的に確保する」場面であれば組み込み型だろうと構造体型だろうと sizeof のお世話にならざるを得ないし, あらかじめ配列の要素数の最大値が分かっているなら逆にどちらであっても sizeof など不要. 余談ですが, 個人的には配列であることがわかっているなら, その要素数は常に sizeof array/sizeof array[0] のようにとるべきだと思います. こう書けば, (array が配列として定義されている限り) 常に正しい値になりますし, ここを見ただけで「array の要素数」であることが明確ですからね.

501xx
質問者

お礼

ご回答いただき、ありがとうございました。 勉強になります。

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答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() も コンパイル時に常数として処理されて、実行形式のプログラムになります。 ご参考に。

501xx
質問者

お礼

丁寧に教えていただき、ありがとうございました。 すっきりとしました。

回答No.3

要素の数は、コンパイル時にすでに決まっているので、わざわざsizeof(array)/sizeof(array[0])という計算をする必要はありません。 しかし、この部分を固定値で5としていると、要素個数を増減する場合にarrayの初期化部分を直すのと同時に、for文の判断部分も直す必要があります。sizeofを使って計算させていれば、初期化部分を直すだけで、自動的に全要素に対してfor文がループしてくれます。 sizeofはコンパイル時に要素のサイズに置き換わるので、直接要素数を記述したのと出来上がるバイナリは同じになり、効率が下がるということもありません。

501xx
質問者

お礼

丁寧に教えていただき、ありがとうございました。 すっきりとしました。

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答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 が有効(というより有り難い存在)なのは、構造体や、構造体配列の時などでしょうね。恐らく、今後構造体などを学んで行くと、この有り難さが良く理解出来てくるかと思います。(定義した構造体配列のメモリ領域を確保する、など) ご参考に。

501xx
質問者

お礼

丁寧に教えていただき、ありがとうございました。 すっきりとしました。

501xx
質問者

補足

ご回答いただき、ありがとうございました。 【配列全体のサイズとは、 要素の数 × 要素のサイズ】と教えていただきましたが、パソコンが【int array[] = {42,79,13,75,19}】というプログラムの記述から要素の数を自動で5であると認識し、要素のサイズを掛けて配列全体のサイズを記憶しているのでしょうか。 教えていただきたく、お願い致します。

関連するQ&A