次のコード
#include <iostream>
using namespace std;
int main()
{
const char* const foo = "f";
const char bar[] = "b";
cout << "sizeof(string literal) = " << sizeof( "f" ) << endl;
cout << "sizeof(const char* const) = " << sizeof( foo ) << endl;
cout << "sizeof(const char[]) = " << sizeof( bar ) << endl;
}
出力
sizeof(string literal) = 2
sizeof(const char* const) = 4
sizeof(const char[]) = 2
gCCでコンパイルされた32ビットOS上。
sizeof
が文字列リテラルの長さ(必要なスペース)を計算するのですか?sizeof
に指定された場合、文字列リテラルは(char *またはchar []から)異なる型を持っていますか?sizeof("f")
は2を返す必要があります。1つは「f」、もう1つは終了する「\ 0」です。sizeof(foo)
は32ビットマシンでは4、64ビットマシンでは8を返します。sizeof(bar)
は2を返します。これは、barが「b」と終了「\ 0」の2文字の配列であるためです。文字列リテラルの型は「サイズNのcharの配列」で、Nには終端ヌルが含まれます。
配列は、sizeof
に渡されたときにポインターに減衰しません。
sizeof
は、オペランドのサイズをバイト単位で返します。それは質問番号1に答えるはずです。;)また、文字列リテラルは、sizeof
に渡されたとき、「array to n const char」型です。
テストケース、1つずつ:
"f"
は、文字f
と終了NULの2つの文字で構成される文字列リテラルです。foo
はポインター(編集:修飾子に関係なく)であり、ポインターはシステム上で4バイト長のようです。bar
の場合、大文字と小文字は"f"
と同じです。お役に立てば幸いです。