TPY ENGINEERING VLOG

TPY ENGINEERING VLOG(C,JAVA)

*C言語* 〜35時限目〜 ポインタに[ ]演算子を使う・・・

〜目次〜

 

 

 

ポインタに[ ]演算子を使う

配列名を先頭要素へのポインタとして使う

ということができることを学びました。

これとは逆に、

ポインタに[ ]を使って配列のように表記する

ということもできます。

34時限目のavg( )関数の中のポインタpTを、

[ ]を使うことで、以下のようにあらわせます。

pT[2]

この[ ]のことを 、

添字演算子(subscript operator)

と呼びます。

このようにポインタに[ ]を使った表記は、

ポインタpTがさしている要素から数えて、2つ先の要素

をあらわすことになっています。

ポインタが配列をさしている時は、

ポインタに[ ]をつけて、それがさし示す要素をあらわすことが、

できるようになっているのです。

つまり、配列と同じ表記になるのです。

ただし、[ ]が正しく使えるには、

ポインタと配列が密接な関係を持つ時のみ

となっているので注意してください。

この関数では実引数として配列の先頭要素のアドレスが

渡されてくるので、

[ ]を使った表記ができるのです。

ほかのポインタに[ ]を使ってしまうと、

予期せぬエラーが起こる場合があります。

実際に以下のコードは[ ]を使って入力したものです。

sample77.c

f:id:YuyaTerayama:20180911202630p:plainーsample77の実行画面ー

5人分のテストの点数を入力してください。

99

70

77

13

56

5人分のテストの平均点は63.000000点です。

実行結果に変化はありません。

pT[i]という表記を使うことで、

ポインタpTがさす配列の要素を順番に出力しています。

つまり、この関数は前のavg( )関数と全く同じ処理を行うことができます。

このように、

ポインタと配列に関係がある場合は、

ポインタと配列を同じように扱うことができる

ということが確認できます。

 

文字列をポインタで使う

文字列を扱うコードは、

実際によく作成するコードになります。

なので、

配列やポインタを使って文字列を、

自由に使えるように勉強していきます。

文字列はchar型の配列であるということを、

思い出してください。

文字列はchar型へのポインタを使って扱うことができます。

以下のようにして扱えるのです。

char *str = "Hello";

char型へのポインタに代入する場合には、

文字列を配列で扱う場合とは異なり、

ポインタで扱う場合には、" "を使うことで、

メモリ上のどこか別の場所に文字列が格納され、

その場所をさすようにするということになります。

実際に以下のコードで確認します。

sample78.c

f:id:YuyaTerayama:20180911203435p:plainーsample78の実行画面ー

文字列はHelloです。

文字列を配列で扱う場合も、ポインタで扱う場合も、

同じように出力することができます。

 

配列とポインタの違いについて

文字列を配列で扱う場合とポインタで扱う場合には、

いくつか注意をすることがあります。

配列を使って文字列を格納した場合には、

以下のように" "を使って初期化したあと、

あらためて文字列全体を配列に代入することはできません。

char str[ ] = "Hello";

//str = "Goodbye";   (配列に代入することはできない)

これに対して、

文字列を" "を使ってポインタで扱うように格納した場合には、

さらに" " を使って扱う文字列を変更することができます。

char *str = "Hello";

str = "Goodbye";     (別の場所にある文字列をさすように変更できる)

ポインタの場合は、

どこか別の場所に格納されている文字列をさすので、

ポインタのさし示す場所を変更するだけで、

扱う文字列を変更することができます。

まとめると、

  • 配列・・・配列名に代入して文字列を変更することはできない
  • ポインタ・・・ポインタに代入してさし示す文字列を変更できる

また、文字列を入力する場合には、

配列を宣言して、文字列を格納する領域を確保しなくてはいけない。

ポインタは" "などを使いどこか別の場所に格納されている、

文字列をさし示すためのものなので、

ポインタによって入力する方法は使わないです。

文字列は配列とポインタの2通りで扱うことができるが、

2つの違いに気をつけてコードを作成する必要がある。

 

次回は文字列配列の配列から学んでいきます。

 

〜END〜