配列については、すでに第22章でやりました。 そのほかにも、あちこちで出てきています。何となく使い方は 暗黙のうちにわかっていると思います。
と、した場合s[0]='A', s[1]='B', s[2]='C', s[3]='D', s[4]='E', s[5]='\0'の ことですね。あー、上の書き方では、最後の'\0'を忘れそうですね。static char s[] = "ABCDE"; (本当は、static char s[] = {'A', 'B', 'C', 'D', 'E', '\0'})
はどうでしょうか。sは配列名です。配列名のみでは、その配列の先頭の 要素のアドレスを表すということはすでに以前に書きました。 だからsはs[0]のアドレスつまり&s[0]を表しています。 それを文字型ポインタptrに代入しているのです。 では、今回は新しくputcharというのもついでに覚えましょう!static char s[] = "ABCDE"; char *ptr; ptr = s;
putchar はマクロです。 stdio.hに#include <stdio.h> int putchar(int c);
#define putchar(_c) putc((_c),stdout)と書かれています。でも超初心者は、これを関数と考えて 使ってもあまり問題は生じません。(時には問題が起こることもある) また、処理系によってはこれを関数にしているものもあるようです。 (細かいことは、あまり気にしないこと)
アスキーコード表の65番から122番までを 出力するプログラムです。これでputcharの使い方 わかったでしょうか。
また、10文字表示したところで改行を出力
して見やすいようにしていることにも注意してください。
はい、この通り!
では、ポインタを使って"ABCDE"を出力してみましょう。
で、配列sの先頭の要素のアドレスをポインターに代入しました。 配列は、s[0],s[1],s[2],・・・・の順にメモリ中に確保されます。 従って、ptr+1はs[1]のアドレスを表します。 これに、「*」をつけるとその指し示す内容を表します。 *(ptr+1)はs[1]の内容つまり'B'を表します。 次々にポインタを進めるには、「++」を使えばよいですね。 *ptr++とすればよいです。static char s[] = "ABCDE"; ptr = s;
s[0]のアドレスをポインターに代入します。
その後、永久ループに入ります。
ポインターを1つずつ進めて、ヌル文字を出力したあと ループを脱出してプログラムの終了です。 ここでもう少し気の利いたプログラムにするには、 ヌル文字は、while()のかっこ内を偽にするため、次のように書き換える こともできます。
この方が、短くてすっきりしますね。でも超初心者はスマートな プログラムよりも、自分でしっかり納得できるプログラムを書いた 方が間違いがありません。while(*ptr) putchar(*ptr++);
はい、きちんと「ABCDE」と表示されました。
では、次に進みましょう。これも以前に出てきました。
char *str = "ABCDE";
こんな使い方もありましたね。これは、次のように考えたらどうでしょう。
これは、筆者がこじつけたのですが全くの間違いではないでしょう。 ここで、賢明な読者(視聴者?)は「じゃ、"ABCDE"自体は 最初の文字のアドレスを表すの?」と言う疑問を持つことでしょう。 その通りです!!さらに、このように宣言しても、配列で中身を 参照することもできます。例を示しましょう。char s[] = "ABCDE"; char *str; str = s; をまとめて書くと・・・ char *str = "ABCDE";
配列なんかどこにも宣言していないのに、
printfのなかでstr[i]なんて使っているけど
大丈夫なのかな・・・
はい、この通り大丈夫でした。文字列、ポインタ、配列
この3つの関係は重要です。忘れたらまたこの章を見直してください。
Update Nov/18/1996 By Y.Kumei