C++ with Windows API講習/アドレスと文字列

概要

本章では、コンピュータが文字列を表現する方法を学びます。
なお、今後の講習ですぐに必要になる内容でないので、飛ばしても構いません。
ただし、あらすじは読んでおいてください。

あらすじ

文字列の表現方法はいくつかあります。
std::wstringという方法のものをWindowsの関数に渡すときは、後ろに.c_str()とつけましょう。

重要語

メモリ

データを保存しておく場所

アドレス

メモリ内の位置を表す数値

NULL

何もないことを表す値

必要語

関数

結果を返す、動作のまとまり

引数

関数に渡す値

引数とメモリ

まず、前章でMessageBoxW関数に渡した引数の正体を考えなくてはなりません。
以下に、MessageBoxW関数の行のみを切り取っておきました。
Hello, worldの一部
MessageBoxW(NULL, L"Hello, world!", L"MessageBoxW", MB_OK);

引数にできる値

さて、引数とは関数に渡す値でした。
しかし、渡したい値をすべて引数にできるとは限りません。
コンピュータの関数の引数には、数値しか指定できないのです。
MessageBoxW関数で言えば、第1/第4引数は数値です。
つまり、第2/第3引数のような文字列は指定できないはずです。
なお、数値は指定できるので、1文字だけなら可能ですが、それでは文字列とは言えません。

アドレス

コンピュータには、多くの数値を保存できるメモリがついています。
メモリは通常、1バイトごとに書き込みと読み出しができます。
メモリ内の場所を表すには、アドレスという数値を使います。
アドレスは通常、1バイトごとの通し番号という形で付けられています。

符号化

さて、メモリに保存するにも、データを数値にしなければなりません。
このことを、符号化といいます。
例えば、文字の符号化方式が文字コードです。

文字列の終端

文字列には、もう一つ大きな問題があります。
メモリには、数値がずっと並んでいるので、どこまでが文字列かわからないのです。
現在では、主に2つの解決策が使われています。
昔は、文字列の長さを固定してしまうという方法がとられたこともありました。

終端文字/NULL

この方法では、文字列の終端の次に、終端文字という文字という特殊な文字を入れます。
これは、C++の前身であるC言語で採用されています。
C++の文脈では、C方式の文字列と呼ばれることもあります。
通常、終端文字には、NULLという値があてられます。
NULLは、ヌルと読み、何もないことを表します。
MessageBoxWの第1引数にもNULLを指定していました。
指定すべき値について解説していないので、この引数で渡すデータはない、という意味でした。

長さを保存

もう1つの方法は、文字列の前に、長さを書いておく方法です。
こちらは、C++で主に使用されています。
この方法では、引数の値が表しているのは文字列のアドレスではありません。
つまり、終端文字を使う方法とは互換性がないのです。

文字列の変換

さて、Windowsは主にC言語で書かれています。
ですから、Windowsの関数は、前者の終端文字の方式を使います。
しかし、私たちは今、C++でプログラムを書いています。
次の章では、std::wstringという種類の文字列が現れます。
この種類では、後者の方式を用いることが決められています。
これら2方式には整合性がありませんから、そのままではエラーになってしまいます。
このような場合、値の後ろにc_str関数をつけます。
この関数は、後者の値を前者の方式の値に変換します。
詳しい書き方は次章を見てください。