▽1
●
ターンタワン ●200ポイント ベストアンサー |
sizeof演算子で型のサイズがわかるのはそれは処理系(コンパイラー)が知っているからとしか言えません。型のサイズがわからなければまともにメモリーの確保もできません。逆に言えばC言語はそれを使う人に、型のサイズを取得するインターフェイス、つまりsizeof演算子を提供しないときちんとしたプログラムが書けない場面がでてくる言語でもあります。
なお、ほとんどのコンパイラーはsizeof(int)のような場合は最適化の一部としてコンパイル時に数値化してしまうはずです。
aを宣言したスコープ内でのaの型はint[10]ですので、sizeof(a)の値はsizeof(int)*10になります。関数で渡した先では型は int* ですので、ポインタのサイズがsizeofの値となります。
C言語では配列の値渡しはできませんので、常にこうなります。呼び出された関数のスコープ内では元の配列のサイズ情報は失われています。
なお、構造体のメンバーとして配列を宣言してしまえば値渡しにすることができますが、一般的にはそのぶんメモリと速度が犠牲になります。