*C言語* 〜35時限目〜 ポインタに[ ]演算子を使う・・・
〜目次〜
ポインタに[ ]演算子を使う
配列名を先頭要素へのポインタとして使う
ということができることを学びました。
これとは逆に、
ポインタに[ ]を使って配列のように表記する
ということもできます。
34時限目のavg( )関数の中のポインタpTを、
[ ]を使うことで、以下のようにあらわせます。
pT[2]
この[ ]のことを 、
添字演算子(subscript operator)
と呼びます。
このようにポインタに[ ]を使った表記は、
ポインタpTがさしている要素から数えて、2つ先の要素
をあらわすことになっています。
ポインタが配列をさしている時は、
ポインタに[ ]をつけて、それがさし示す要素をあらわすことが、
できるようになっているのです。
つまり、配列と同じ表記になるのです。
ただし、[ ]が正しく使えるには、
ポインタと配列が密接な関係を持つ時のみ
となっているので注意してください。
この関数では実引数として配列の先頭要素のアドレスが
渡されてくるので、
[ ]を使った表記ができるのです。
ほかのポインタに[ ]を使ってしまうと、
予期せぬエラーが起こる場合があります。
実際に以下のコードは[ ]を使って入力したものです。
sample77.c
ーsample77の実行画面ー
5人分のテストの点数を入力してください。
99
70
77
13
56
5人分のテストの平均点は63.000000点です。
実行結果に変化はありません。
pT[i]という表記を使うことで、
ポインタpTがさす配列の要素を順番に出力しています。
つまり、この関数は前のavg( )関数と全く同じ処理を行うことができます。
このように、
ポインタと配列に関係がある場合は、
ポインタと配列を同じように扱うことができる
ということが確認できます。
文字列をポインタで使う
文字列を扱うコードは、
実際によく作成するコードになります。
なので、
配列やポインタを使って文字列を、
自由に使えるように勉強していきます。
文字列はchar型の配列であるということを、
思い出してください。
文字列はchar型へのポインタを使って扱うことができます。
以下のようにして扱えるのです。
char *str = "Hello";
char型へのポインタに代入する場合には、
文字列を配列で扱う場合とは異なり、
ポインタで扱う場合には、" "を使うことで、
メモリ上のどこか別の場所に文字列が格納され、
その場所をさすようにするということになります。
実際に以下のコードで確認します。
sample78.c
ーsample78の実行画面ー
文字列はHelloです。
文字列を配列で扱う場合も、ポインタで扱う場合も、
同じように出力することができます。
配列とポインタの違いについて
文字列を配列で扱う場合とポインタで扱う場合には、
いくつか注意をすることがあります。
配列を使って文字列を格納した場合には、
以下のように" "を使って初期化したあと、
あらためて文字列全体を配列に代入することはできません。
char str[ ] = "Hello";
//str = "Goodbye"; (配列に代入することはできない)
これに対して、
文字列を" "を使ってポインタで扱うように格納した場合には、
さらに" " を使って扱う文字列を変更することができます。
char *str = "Hello";
str = "Goodbye"; (別の場所にある文字列をさすように変更できる)
ポインタの場合は、
どこか別の場所に格納されている文字列をさすので、
ポインタのさし示す場所を変更するだけで、
扱う文字列を変更することができます。
まとめると、
- 配列・・・配列名に代入して文字列を変更することはできない
- ポインタ・・・ポインタに代入してさし示す文字列を変更できる
また、文字列を入力する場合には、
配列を宣言して、文字列を格納する領域を確保しなくてはいけない。
ポインタは" "などを使いどこか別の場所に格納されている、
文字列をさし示すためのものなので、
ポインタによって入力する方法は使わないです。
文字列は配列とポインタの2通りで扱うことができるが、
2つの違いに気をつけてコードを作成する必要がある。
次回は文字列配列の配列から学んでいきます。
〜END〜