C言語の重要な機能の一つである「ポインタ」は、文字列処理でよく用いられます。
そこで今回のC言語超入門では、ポインタについて理解を深めるために、
文字列とポインタの関係についてご説明していきます。

文字配列はポインタ変数のように変数アドレスを扱うことができる

まずは、以下のプログラム1を見てください。
これは、文字列をポインタで処理するサンプルプログラムです。

/* プログラム1 */
#include <stdio.h>
main() {
    char moji[]="Windows";
    char *pt;
    pt = moji;    /* 配列mojiの先頭アドレスを、ポインタptに代入 */
    printf("moji = %s\n", moji);
    printf("pt = %s\n", pt);
}
※プログラム1の実行結果
moji = Windows
pt = Windows

さて、プログラム1の実行結果を見ますと、変数mojiと変数ptが、まったく同じものになっていることが分かりますね。
まず処理の最初で、char型配列mojiの先頭アドレスがchar型ポインタ変数ptに代入しています。
ここでポイントになるのが、配列変数のアドレスを取り出すときは、変数名の頭にアドレスを取り出す演算子&が必要ない、ということです。
単一の変数の場合は、変数のアドレスを取り出したい場合、演算子&を変数名の前につける必要がありましたね。
(参考:C言語超入門(第35回))
でも配列変数の場合は、演算子&を使わなくても、まるでポインタ変数のように変数アドレスを扱うことができるのです。
ちなみに、あえて配列変数に&を付けてコーディングをしたいのでしたら、次のように記述することができます。

 pt = &moji[0];

ポインタは、文字列の任意のアドレスを示すことができる

プログラム1では、ポインタ変数ptは、配列変数mojiの先頭アドレスを示していましたが、
ポインタ変数の値を書き換えることで、文字列の任意のアドレスを示すことができます。
例えば、moji[2]の場所を指し示すためには、*(pt+2)と表現します。(プログラム2)

/* プログラム2 */
#include <stdio.h>
main() {
    char  moji[]="Windows";
    char *pt;
    pt = moji;
    printf("moji = %s\n", moji);
    printf("moji[2] = %c\n", moji[2]);
    printf("*(pt+2) = %c\n", *(pt+2));
}
※プログラム2の実行結果
moji = Windows
moji[2] = n
*(pt+2) = n

さて、もう一つ、ポインタ変数の値を書き換えた処理方法をご紹介します。
以下のプログラム3は、配列要素番号を指定して文字出力した場合と、
ポインタ変数を書き換えて文字出力した場合の、サンプルプログラムです。

/* プログラム3 */
#include <stdio.h>
main() {
    char  moji[]="Windows";
    printf("moji[]  =  %s\n", moji);
    /* 配列要素番号を指定して文字出力 */
    int i = 0;
    printf("moji[i++]  =  ");
    while(moji[i]) putchar(moji[i++]); /* 配列要素番号を指定して文字出力 */
    /* ポインタを移動して文字出力 */
    char *pt = moji;
    printf("\n*pt++  =  ");
    while(*pt) putchar(*pt++);  /* ポインタ変数を書き換えて文字出力 */
}
※プログラム3の実行結果
moji[]  =  Windows
moji[i++]  =  Windows
*pt++  =  Windows

プログラム2やプログラム3をよく見ながら、配列要素番号を指定して文字出力する方法と、
ポインタ変数を書き換えて文字出力する方法について、理解を深めてください。
どちらの記述が良い、悪い、というものではありませんので、使い方はプログラマーの好みによります。

C言語超入門の第36回まとめ

さて今回のC言語超入門では、文字列とポインタの関係について解説してきましたが、いかがでしたでしょうか。
ここまで読んでみて、「配列を使えばポインタは必要ないのでは?」と感じたかもしれませんね。
確かに、その通り、とも言えるかも知れません。
なぜなら、分かりにくいポインタを使わなくても、配列を上手に使うことで記述できるケースは、よくあることだからです。
ですから、もし、いま一生懸命にポインタを理解しようとしてC言語の学習がストップしてしまうくらいなら、
まずは、C言語の基本的なことを一通り学んだ後、改めてポインタについて学習をした方が、結果としてC言語の習得が早まる、かもしれません。
C言語初心者のうちは、無理にポインタを覚えようとしなくても大丈夫ですよ。
ステップ・バイ・ステップ。焦らず一歩ずつ進んでいきましょう。