文字列とポインタ | Q's software

文字列とポインタ

C 言語のポインタを理解する の応用編。文字列とポインタの関係について説明します。

C 言語を学ぶと初期に出てくる文字列です。
char のポインタだけ、文字列って特殊な呼び方をすることが多いですね。ただ、文字列と単純に char のポインタです。同じことを名前を変えて 2 つ覚える必要張りません。文字列で???ってなる人はあまりいませんが、文字列の配列で???となったり、ゴゴゴってりメモリ破壊したりする人が現れたりします。

なので、ポインタの基礎概念とポインタの基礎文法と照らし合わせ、文字列の仕組みをしっかり理解します。概念なんで、まずは、文字列で
char *string = "Hello World.";

というプログラムは、以下のようなメモリ構造になります。
$Q's software

ただ、Hello World のように固定の文字列なら問題はありませんが、人の名前をいれるとかは人によって文字列の長さが違うような場合は、以下のようにプログラムを書きます。

char *your_favor;
char *entry_girl_01 = "Aya Ueto";
char *entry_girl_02 = "Nozomi Sasaki";
char *entry_girl_03 = "Haruka Ayase";

// Which girl do you like?
your_favor = malloc(strlen(entry_girl_03));
strcpy(your_favor, entry_girl_03);
printf("You love %s \n", your_favor);


これは、プログラムを動かすと以下のようにメモリが書き換わります。
  • 変数宣言直後

      $Q's software

  • strcpy 直後

      $Q's software

だけど、あの 3 人の美女から 1 人を選べなんて無理です!って浮気野郎は、以下のようにプログラムを書きます。

int i;
char **your_favor;
char *entry_girl_01 = "Aya Ueto";
char *entry_girl_02 = "Nozomi Sasaki";
char *entry_girl_03 = "Haruka Ayase";

// Which girl do you like?
your_favor = malloc(3);
your_favor[0] = malloc(strlen(entry_girl_01));
your_favor[1] = malloc(strlen(entry_girl_02));
your_favor[2] = malloc(strlen(entry_girl_03));

strcpy(your_favor[0], entry_girl_01);
strcpy(your_favor[1], entry_girl_02);
strcpy(your_favor[2], entry_girl_03);
printf("You love ");
for (i = 0; i < 3; i++) {
printf("%s ,", your_favor[i]);
}

どうしても 3 人ともあきらめられないので 3 人確保できるように char** で 3 人分の場所を用意してから、個々の名前を置く場所を確保します。
これは、プログラムを動かすと以下のようにメモリが書き換わります。

  • 変数宣言直後

      $Q's software

  • strcpy 直後

      $Q's software


忘れられがちなのは、char** で char* の配列を確保していることでしょうね。
※ entry_girl_0(1|2|3) は時代を反映させて個人で修正してください。

人気ブログランキングへ ← 読んだらプチっとお願いします。