第25章 文字列とポインタの関係


あー!またポインターか!ハーッ(ため息)

と、いわずに今回も文字列とポインターの関係について ゲーム感覚で勉強しましょう。勉強という言葉がいけないですね。 「無理矢理覚え込ます」というような 意味にとれます。

今回は、文字列とポインタで遊びましょう!

これならいいでしょう。

配列については、すでに第22章でやりました。 そのほかにも、あちこちで出てきています。何となく使い方は 暗黙のうちにわかっていると思います。

static char s[] = "ABCDE"; (本当は、static char s[] = {'A', 'B', 'C', 'D', 'E', '\0'})

と、した場合s[0]='A', s[1]='B', s[2]='C', s[3]='D', s[4]='E', s[5]='\0'の ことですね。あー、上の書き方では、最後の'\0'を忘れそうですね。

static char s[] = "ABCDE"; char *ptr; ptr = s;

はどうでしょうか。sは配列名です。配列名のみでは、その配列の先頭の 要素のアドレスを表すということはすでに以前に書きました。 だからsはs[0]のアドレスつまり&s[0]を表しています。 それを文字型ポインタptrに代入しているのです。 では、今回は新しくputcharというのもついでに覚えましょう!

あれ?これって以前出てこなかった?

なかなか記憶力がいいですね。でもちょっと違います。 (と、言いつつもしかしたら出てきていたかもしれないと以前のファイルを調べる 筆者であった。こういうとき筆者は「Sfind」というツールを使います。他の人は知らないけど こういう場合結構役に立ちます。)
puts・・・・・第7章
putc・・・・・第20章
に、似たようなのが出てましたがputcharは新出です。

#include <stdio.h> int putchar(int c);

putchar はマクロです。 stdio.hに
#define putchar(_c)      putc((_c),stdout)
と書かれています。でも超初心者は、これを関数と考えて 使ってもあまり問題は生じません。(時には問題が起こることもある) また、処理系によってはこれを関数にしているものもあるようです。 (細かいことは、あまり気にしないこと)

アスキーコード表の65番から122番までを 出力するプログラムです。これでputcharの使い方 わかったでしょうか。

また、10文字表示したところで改行を出力 して見やすいようにしていることにも注意してください。

はい、この通り!

では、ポインタを使って"ABCDE"を出力してみましょう。

static char s[] = "ABCDE"; ptr = s;

で、配列sの先頭の要素のアドレスをポインターに代入しました。 配列は、s[0],s[1],s[2],・・・・の順にメモリ中に確保されます。 従って、ptr+1はs[1]のアドレスを表します。 これに、「*」をつけるとその指し示す内容を表します。 *(ptr+1)はs[1]の内容つまり'B'を表します。 次々にポインタを進めるには、「++」を使えばよいですね。 *ptr++とすればよいです。
どうして、*(ptr++)のようにカッコがいらないかわかりますか? それは、ずーと前にやった 演算子の優先順位及び結合性を思い出してください。 この表を見ると「*」と「++」は同じ優先順位です。 しかし、結合性は右から左となっています。 ですからまずptr++となり、その後*がつくと言うことになります。 だからカッコがいらないのです。もちろんつけてもかまいません。

s[0]のアドレスをポインターに代入します。

その後、永久ループに入ります。

ポインターを1つずつ進めて、ヌル文字を出力したあと ループを脱出してプログラムの終了です。 ここでもう少し気の利いたプログラムにするには、 ヌル文字は、while()のかっこ内を偽にするため、次のように書き換える こともできます。

while(*ptr) putchar(*ptr++);

この方が、短くてすっきりしますね。でも超初心者はスマートな プログラムよりも、自分でしっかり納得できるプログラムを書いた 方が間違いがありません。

はい、きちんと「ABCDE」と表示されました。

では、次に進みましょう。これも以前に出てきました。

char *str = "ABCDE";

こんな使い方もありましたね。これは、次のように考えたらどうでしょう。

char s[] = "ABCDE"; char *str; str = s; をまとめて書くと・・・ char *str = "ABCDE";

これは、筆者がこじつけたのですが全くの間違いではないでしょう。 ここで、賢明な読者(視聴者?)は「じゃ、"ABCDE"自体は 最初の文字のアドレスを表すの?」と言う疑問を持つことでしょう。 その通りです!!さらに、このように宣言しても、配列で中身を 参照することもできます。例を示しましょう。

配列なんかどこにも宣言していないのに、 printfのなかでstr[i]なんて使っているけど 大丈夫なのかな・・・

はい、この通り大丈夫でした。文字列、ポインタ、配列 この3つの関係は重要です。忘れたらまたこの章を見直してください。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Nov/18/1996 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。