概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C ポインタと文字列
2006年08月08日 (火) | 編集 |
なんで文字列が関わってくるのって感じだが、何せポインタはメモリのアドレスを指定してデータを参照する概念なのである。配列をどうのこうのできても不思議はあるまいよ。

面倒そうではあるけどなあ。
ってこればっかだな。
Cの文字列は""を使って、例えば"Hello"みたいに表すわけだ。printfでお馴染みだな。
この文字列がメモリ上でどう格納されているかというと、

string_chara.jpg

こんな感じ。
右端の\0が文字列の終わりを示す値で、これはCのコンパイラが"Hello"という文字列をメモリ上に格納する際に自動的に付加してくれる。

さて本題。

文字列をポインタで扱う場合は

char *str;
str="Hello";

1行目はstrがcharへのポインタという宣言で、2行目で"Hello"を格納してあるメモリの先頭アドレスがポインタ変数strに代入される。"Hello"という文字列そのものが代入されるわけではないことに注意だ。

まあこれで前回のポインタ変数pa=&a;のようにアドレスを代入することが出来たわけだが、値の方、前回言うところの*paはどうなるか?
今ポインタ変数strには"Hello"を格納しているメモリの先頭アドレスが代入されているわけなので…*strで参照出来るのは最初の文字"H"なのである。次以降の文字はどうなるのかというとstr++とポインタを進めることによって次の文字を参照出来るのだと。

変なの。
ま、実際にやってみよう。
文字列の文字を1文字ずつ取り出して表示するプログラムを組んでみる。

まずポインタ変数strを宣言し、strに文字列の先頭アドレスを代入する。
宣言と代入は上記の通り、変数strに"Hello"でいいだろう。
次にstrから文字を順番に取り出して表示する部分だが、
文字列の最後に\0という印があるので

while (*str!='\0'){
 printf("%c\n",*str);
 str++;
}


これでstrが\0になるまで*strのデータを参照し、表示し、ついでに次の文字のアドレスを代入する為にstr++というループを繰り返す記述になる。

pointer_str_test.jpgpointer_str_test2.jpg

こんな感じ。シンプルやね。

ちょっといじくって文字列を入力出来るようにしてみた

pointer_str_test3.jpgpointer_str_test4.jpg

が、全角だと駄目っぽいやね。
ついでに半角英数だと問題ないようだが、これで合っているかどうかは不明。


まとめよう。

文字列を扱う場合はchar *str; str="XXXX";のように記述する
*strで参照出来るのは文字列の最初の1文字である


以上。
テキストの量は然程多くもないがよく分からんのー。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。