目次
はじめに
C++やC言語において、"Hello"
のような文字列リテラルは、内部的には文字 (char
) の配列として扱われます。
この文字配列には特別なルールがあります。それは、文字列の最後に必ず「終端NULL文字」という、「ここで文字列は終わりです」と示すマーカーを付ける必要がある、という点です。
この記事では、文字列と文字配列のこの基本的な関係性と、終端NULL文字の役割について解説します。
文字列は char
型の配列
"World"
という5文字の文字列は、メモリ上では、以下のような6つの要素を持つ char
型の配列として格納されています。
W | o | r | l | d | NULL文字 |
[0] | [1] | [2] | [3] | [4] | [5] |
最後の「NULL文字」が、文字列の終わりを示すマーカーです。このマーカーは、コード上では '\0'
と記述します。
cout
などの関数は、この '\0'
を見つけるまで文字の出力を続けます。そのため、配列として文字列を扱う場合は、必ず文字数 + 1 の領域を確保する必要があります。
文字配列の初期化と出力
完成コード
#include <iostream>
using namespace std;
int main() {
// 方法1: 文字列リテラルで一括初期化(推奨)
// コンパイラが自動で末尾に終端NULL文字('\0')を追加する
char message1[] = "Welcome";
// 方法2: 文字ごとに個別に初期化
// この場合、終端NULL文字('\0')を手動で追加する必要がある
char message2[6];
message2[0] = 'H';
message2[1] = 'e';
message2[2] = 'l';
message2[3] = 'l';
message2[4] = 'o';
message2[5] = '\0'; // 終端NULL文字
// 配列を文字列として出力
cout << message1 << endl;
cout << message2 << endl;
return 0;
}
実行結果
Welcome
Hello
コードの解説
char message1[] = "Welcome";
文字列リテラル("..."
)で初期化する場合、終端NULL文字 \0
はコンパイラによって自動的に配列の末尾に追加されます。これが最も簡単で安全な方法です。
char message2[6]; ... message2[5] = '\0';
文字ごとに手動で設定する場合、必ず配列の最後に終端NULL文字 \0
を代入する必要があります。これを忘れると、cout
が文字列の終わりを認識できず、予期せぬ動作を引き起こします。
まとめ
今回は、C++/C言語における文字列と文字配列の基本的な関係について解説しました。
- 文字列は、終端NULL文字 (
'\0'
) で終わる、char
型の配列である。 - 文字列リテラルで初期化すれば、終端NULL文字は自動で付加される。
- 文字ごとに初期化する場合は、最後に
\0
を手動で追加することを忘れない。