はじめに
C++やC言語において、"Welcome"
のような、ダブルクォーテーションで囲まれた文字列(文字列リテラル)は、プログラムの特別な読み取り専用メモリ領域に格納されます。
このような文字列リテラルをプログラムで扱う際、その文字列が格納されているメモリの先頭アドレスを指し示す「ポインタ」を利用するのが一般的です。この記事では、文字列リテラルを指すポインタ const char*
の基本的な使い方を解説します。
const char*
を使ったサンプルコード
このコードは、const char*
型のポインタを宣言し、文字列リテラル "Hello, World!"
で初期化します。その後、ポインタを使ってその文字列を画面に出力します。
完成コード
#include <iostream>
using namespace std;
int main() {
// 1. const char* 型のポインタを、文字列リテラルで初期化
const char* message = "Hello, World!";
// 2. ポインタをcoutに渡して、文字列全体を出力
cout << message << endl;
return 0;
}
実行結果
Hello, World!
コードの解説
const char* message = "Hello, World!";
この一行は、2つの重要なことを同時に行っています。
- 文字列リテラルの配置: コンパイラは、
"Hello, World!"
という文字列(と終端NULL文字\0
)を、プログラムの読み取り専用のメモリ領域に配置します。 - ポインタの初期化:
const char*
型のポインタ変数message
を宣言し、そのポインタに、先ほどメモリに配置された文字列の先頭文字H
のアドレスを格納します。
const
の重要性
const
は、このポインタを通じて、指し示している先のデータを変更しない、という宣言です。
const char*
: 「char
型の定数(変更不可な文字)を指すポインタ」 文字列リテラルは読み取り専用領域にあるため、*message = 'h';
のようにポインタ経由で内容を書き換えようとすると、コンパイルエラーになるか、実行時にプログラムがクラッシュします。const
を付けておくことで、このような危険な操作をコンパイラが事前に防いでくれます。
cout << message << endl;
cout
は、char*
型(または const char*
型)のポインタを渡されると、そのアドレスから始まって、終端NULL文字 \0
が現れるまでの全ての文字を画面に出力する、という特別な動作をします。
まとめ
今回は、C++やC言語におけるC言語スタイルの文字列リテラルの基本的な扱い方として、const char*
ポインタを使う方法を解説しました。
- 文字列リテラルは、読み取り専用メモリに格納される。
const char*
型のポインタで、その文字列リテラルの先頭アドレスを指し示す。const
を付けることで、読み取り専用データを誤って変更しようとするのを防ぐことができる。
C++では std::string
クラスを使う方がはるかに安全で便利ですが、関数の引数などでC言語スタイルの文字列を扱う場面は依然として多く、この const char*
の仕組みを理解しておくことは非常に重要です。