文字列

char* hello ()
{
   return "Hello, world!";
}

でいいみたいなんだけど、理解が引っかかった。

char* hello ()

ってことはこの関数は `char` へのポインタを返すはずだ。

そもそも文字列変数の宣言は

char hello[] = "Hello, world!";

と書くって話だったけど

char* hello = "Hello, world!";

と書いてもおkだとか。よくわからない。とかなんとか、そんな感じでもにょもにょしてたんだけど。

まず C/C++ には文字列なんてものは存在しなくて、文字の配列を文字列として使ってる(これは知ってたんだけど)。

const char baka[] = "baka";
const char baka[5] = {'b', 'a', 'k', 'a', '\0'};

この2つは同じこと。

const char* aho = "aho";

と書くのは、

const char ahoINTERNAL[ 4 ] = {'a', 'h', 'o', '\0'};
const char* &ahoINTERNAL[ 0 ];

の省略形のようなものである。
# ゲームプログラマになる前に覚えておきたい技術 P.33

なのでやっぱり `char* var = "blah";` とすると `var` は「char の配列(の先頭)へのポインタ」になる。

んでもって配列ってのはその配列の先頭要素へのポインタだった。

int n[] = {2, 8, 4};
cout << ((n == &n[0]) ? "TRUE" : "FALSE") <<endl;  //TRUE

ここまでは「文字列ってのは char の配列であり、つまり最初の char へのポインタなんだ」ってことでおkにして。

関数が「char の配列の先頭へのポインタ」を返したとして、それを受け取った方ではそのアドレスからどこまでが文字列なのかわかんねーじゃん。と思ったのだけど、たぶん最後にくっつく `'\0'` はそのためにあるんだろう、と実験。

char* hello ()
{
  return "hello\0world!";
}

int main ()
{
  cout << hello() <<endl;
  return 0;
}

でやっぱり "hello" しか表示されなかったので、`char` へのポインタを cout に出力するときはそっから '\0' までを読んでくれるんだろう。


そんで、もうひとつスッキリしないのが

int n = 33;
int* adr = &n;
cout << adr <<endl;

だと "33" ではなくてアドレスが出力されるのに

char s[] = {'h', 'e', 'l', 'l', 'o', '\0'};
char* adr = &s[0];
cout << adr <<endl;

だとちゃんと(?)"hello" と出力される。cout がよきに計らってくれてるんかな。