浅分析C/C++の中で誤解されているSIZEOF

1610 ワード

1:sizeofは関数ですか?2:sizefとstreenの違い?3:sizeof(int)(*p)の値はいくらですか?

int a[10];
   sizeof(a);// ?
   sizeof(a[10]);// ?
   void f(int a[10])
   {
     cout<<sizeof(a)<<endl;// ?
   }
View Code
解答:1:最初の問題に対して、sizefは関数ではなく、言語内のキーワードです。信じないなら、sizof 4とsizeof(int)を試してみてください。印刷結果は全部4です。関数なら、括弧を入れなければいけません。sizeofは32のキーワードの中の一つです。もしないなら、本を変えてください。sizeof intとsizeof(int)を試してもいいです。最初はコンパイルできますが、二つ目は確かにコンパイルできます。C/C++言語の規定を考えてみてください。int前はsigned.unsignedしか入れられません。aut、const、volative、変数を修飾するための保存方法は前の面に加えられます。strelenは標準C言語ライブラリ関数で、文字列の長さを求めて、char*str="abacd"で、sizef strとstreen(str)をコンパイルしてみます。結果は4で、結果は5です。つまり、4つのポインタが4バイトを占めています。結果は5つの文字列が長いabacdの5文字です。これは1の助けを借りて、もう詳しく分析しました。つまり、*pの値を取って、intタイプのデータに変換して、Nデータの占めるメモリバイト数を測定します。明らかに一つのint型のデータは4バイトの

int a[10];
sizeof(a) ?
を占めて、測定結果はいくらですか?この結果は40であり、sizeofはここで測定したのは配列のサイズ

int a[10];
sizeof(a[10]) ?
です。注意深い人はa[10]がすでにオフラインアクセスしていることを発見します。ここでsizeofを使ってエラーを報告しません。オフラインエラーは動作時異常であるため、コンパイラは検査しません。この時a[10]コンパイラは配列の中の整形変数と考えられます。結果はもちろん4

void f(int a[10])
   {
     cout<<sizeof(a)<<endl;// ?
   }
の上のこの出力の値はいくらですか?プログラムを書いてみてもいいです。結果は4です。なぜですか?C/C++言語の規定関数は配列をパラメータとしたり値に戻すことができないからです。上の関数は実際のコンパイルの過程で

void f(int *a)
   {
     cout<<sizeof(a)<<endl;// ?
   }
に変換されます。aは整形を指すポインタです。結果は4でも明らかです。