CおよびC++における文字列リテラルの型とは?
C言語とC++での文字列リテラルの型の違い
プログラミング言語によって、文字列リテラルの型の扱いには違いがあります。ここでは、C言語とC++における文字列リテラルの型について詳しく解説します。
C言語の場合
C言語では、文字列リテラルの型は char[](char型の配列)です。つまり、文字列リテラルは変更可能な配列として定義されています。ただし、C標準規格では文字列リテラルの内容を変更しようとした場合の動作は未定義(undefined behavior)とされており、実際には変更しないことが推奨されます。
C++の場合
一方、C++では、通常の文字列リテラルは「const char の n 要素配列」という型を持ちます。例えば、文字列リテラル "Hello" の型は「6 個の const char の配列」となります。これは、終端のヌル文字('\0')を含めた 6 文字分の配列であるためです。
配列からポインタへの変換
文字列リテラルは、配列からポインタへの変換(array-to-pointer conversion)により、const char* 型に変換することができます。これにより、文字列リテラルをポインタ変数に代入したり、関数の引数として渡したりすることが可能になります。
なお、この配列からポインタへの変換は、配列の最初の要素へのポインタを生成するという点に注意してください。つまり、変換後のポインタは文字列の先頭文字を指すことになります。
まとめ
以下に、C言語とC++における文字列リテラルの型の違いをまとめます。
- C言語: 文字列リテラルの型は
char[] - C++: 文字列リテラルの型は
const char[n](n は終端ヌル文字を含む文字数) - どちらの言語でも、配列からポインタへの変換により
const char*として扱うことができる - 変換後のポインタは配列の先頭要素(文字列の最初の文字)を指す
文字列リテラルの型を正しく理解することは、ポインタ操作や文字列処理を行う上で非常に重要です。特にC++では const が付いているため、文字列リテラルの内容を変更しようとするとコンパイルエラーまたは未定義動作となる点に留意しましょう。
-
C#におけるstringとStringの違いは何ですか?
C#のstringとStringの違いC#プログラミングにおいて、stringとStringはどちらも同じ型を指しますが、その扱いには微妙な違いがあります。Stringは.NET FrameworkのクラスであるSystem.Stringを直接表すものであり、一方、stringはC#言語が用意しているSystem.Stringのエイリアス(別名)です。つまり、両者はコンパイル後にまったく同じものとして扱われます。基本的な使い方の例string str = Welcome!;このように文字列変数を宣言する際は、通常小文字のstringを使用します。使い分けの目安厳密なルールはありませんが、一般的
-
C#の文字列リテラルで@プレフィックスを付けるとどうなる?逐語的文字列の基本
C#では、文字列リテラルの先頭に@(アットマーク)を付けると、その文字列は「逐語的文字列(verbatim string)」として扱われます。これにより、記号の後に続く文字列内の特殊文字をエスケープする必要がなくなります。例えば、次の記述は@D:\new以下の記述と同じ意味になります。D:\\new通常の文字列リテラルでは「\」(バックスラッシュ)がエスケープ文字として解釈されるため、「\\」のように2つ重ねて記述する必要があります。しかし、@を付ければ1つで済むため、Windowsのファイルパスや正規表現などを扱う際に特に便利です。また、@プレフィックスは、長い文字列を複数行にわたって記述・