C言語の文字定数と文字列リテラルの違いを完全ガイド!初心者にもわかる基本と具体例
生徒
「C言語で文字を扱うときに、シングルクォーテーションとダブルクォーテーションが出てきますけど、何が違うんですか?」
先生
「それは文字定数と文字列リテラルの違いが関係しています。見た目は似ているけど、中身はまったく違うものなんですよ。」
生徒
「同じように見えるのに違うんですか?間違えて使ったらどうなりますか?」
先生
「C言語ではデータの種類がとても大切なので、正しく理解することが重要です。これからゆっくり説明していきます。」
1.文字定数と文字列リテラルの違いとは?
まず、見た目の違いを押さえましょう。C言語では、文字を扱うときにシングルクォーテーション(')とダブルクォーテーション(")が登場します。
実はこれらはまったく違う意味を持っています。ひとつの文字を扱うのが文字定数、複数の文字の並びを扱うのが文字列リテラルです。名前が長いので覚えにくいですが、使い方を知ればとても簡単です。
文字定数('A' など) は、ひとつの文字を表すためのデータです。C言語の文字データはchar型で扱われ、数値として保存されています。
文字列リテラル("ABC"など)は、複数の文字がひとまとまりになったデータです。C言語では文字列の最後に必ずヌル文字(\0)という終わりを表す記号が自動でつきます。このおかげで、どこまでが文字列かを識別できます。
2.見た目は似ているけれど、値が違う
実際のコードを見てみましょう。同じAという文字でも、シングルクォーテーションとダブルクォーテーションでは意味が変わります。
char c = 'A';
char *s = "A";
cはひとつの文字、sは文字列です。文字列は配列として扱われるため、メモリ上では2つの要素を持ちます。「A」と「\0」です。
3.文字定数は数値として扱われる
C言語の文字は、実は内部的には数値として保存されています。文字にはASCIIコードという番号が割り当てられています。例えば、「A」は65という番号に対応しています。つまり、次のようなことも可能です。
#include <stdio.h>
int main() {
char c = 'A';
printf("%d\n", c);
return 0;
}
65
このように、文字定数はひとつの数字として扱われます。文字列リテラルは配列なので、同じように数値として扱うことはできません。この違いを理解しておかないと、意図しないエラーが発生する可能性があります。
4.文字列リテラルは書き換えられない
文字列リテラルは書き換えることができません。C言語では、文字列リテラルは読み取り専用の領域に保存されるため、次のような書き換えはできません。
char *s = "Hello";
s[0] = 'A'; // これは危険な処理
これは、文字列リテラルが固定された領域に保存されているためです。変えたい場合は配列として準備します。
char s[] = "Hello";
s[0] = 'A'; // これはOK
配列に保存するとメモリ上に書き込み可能な領域が確保されるため、変更できます。初心者のうちは、文字列を書くときは配列にしておくと安全です。
5.printfで違いがわかる
画面に出力するときにも違いが出ます。
printf("%c\n", 'A'); // 文字として出力
printf("%s\n", "A"); // 文字列として出力
%cは文字を出力し、%sは文字列を出力します。これが入れ替わると正しく動作しません。
6.間違えるとエラーが起きる例
初心者がよくつまずく例として、次のようなものがあります。
char c = "A"; // 間違い
char *s = 'A'; // 間違い
どちらも型が一致していないためエラーになります。シングルクォーテーションとダブルクォーテーションは正しく使い分ける必要があります。
7.初心者が覚えておくべきポイント
文字定数はひとつの値、文字列リテラルは複数の値という違いを意識しましょう。ひとつだけ扱いたいなら'A'、複数扱いたいなら"ABC"を使います。
どちらも見た目は似ていますが、扱い方を間違えると正常に動かなくなります。C言語は厳密なプログラミング言語なので、小さな記号の違いに意味があります。