ここでポインタ変数を使って文字列データをメモリに格納するときに使用される[ ]演算子について学んでみましょう [ ]演算子は配列にも使用されていて極めて重要な働きをしています

🌞🌞🌞[ ]演算子をポインタ変数pに作用させ作製した配列変数p[0]はポインタ変数pの格納しているアドレスのメモリに格納されているデータを表します。

ソーラー「今日は[ ]演算子の仕組みについてしらべてみよう。



ソーラー「[ ]演算子はsubscript operator(添字演算子)



とよばれています。」


アレサ「ソーラーさん


[ ]演算子ってどこかでみたことが


あるような気がするのですが・・・・]


ソーラー「そう?


みたことがある?


あったかな~


とりあえず次のプログラムをご覧ください」



#include <stdio.h>


int main(void) {


char *p = "abc";


printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

printf("%s\n", p);

printf("%p\n", p);

return 0;


}


コンパイル結果

a

b

c

00DA7BDC

abc



ソーラー「さて


このプログラムで何がおこなわれているかわかるかな?


char *p = "abc";


char *pにより


ポインタ変数pが生成されるのがわかります。


ですが


なぜか


ポインタ変数pが


文字列データ "abc"によって初期化されている・・・・・??????????


な、なんで?????




アレサ「char *p = "abc";


ですね。(´▽`*)


char *p = "abc";


が実行されると


文字列データ "abc"はメモリに格納されます。


そのとき


文字列データ "abc"が格納されているメモリの先頭のアドレスが


ポインタ変数pに格納されています


printf("%p\n", p);


の実行結果が


00DA7BDC


となっていることから


ポインタ変数pに格納されているアドレスは


00DA7BDC


であることがわかります。


そして


文字列データ "abc"が格納されているメモリの先頭のアドレスが


00DA7BDC


であることもわかります(´▽`*)/」



ソーラー「ははあ なるほどお


つまり


char *p = "abc";


が実行されると


作製されるポインタ変数pに


文字列データ "abc"が格納されているメモリの先頭のアドレスが


代入されて初期化されているんだね。


ポインタ変数pに


文字列データ"abc"そのものが格納されているわけではないんだね。」



アレサ「はいっ そうなんです。


char *p = "abc";


が実行されると


文字列データ "abc"は


アドレス00DA7BDCのアドレスの付いたメモリを先頭として


順にメモリに格納されます。


そして


pのポインタ変数宣言をおこなうと同時に


ポインタ変数pは


アドレス00DA7BDCを代入されて初期化されています。


文字列データ "abc"は


アドレス00DA7BDCのアドレスの付いたメモリを先頭として


順にメモリに格納されるのですが


具体的には


00DA7BDCのアドレス番号の付いたメモリには文字データ'a'

00DA7BDDのアドレス番号の付いたメモリには文字データ'b'

00DA7BDEのアドレス番号の付いたメモリには文字データ'b'

00DA7BDFのアドレス番号の付いたメモリには文字データ'\0'


のように


文字列データ"abc"は分割されて順番にメモリに格納されています。


ところで


00DA7BDCのアドレス番号の付いたメモリには文字データ'a'


が格納されているのですが


文字データ'a'をprintf出力表示したいときは


printf("%c\n",*p);


を実行すればよいことになるのですの。


そのプログラムは次のようになります。


#include <stdio.h>


int main(void) {


char *p = "abc";


printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

printf("%s\n", p);

printf("%c\n", *p);/*ここで文字データ'a'をprintf出力表示しようとしています*/

return 0;


}


コンパイル結果


a

b

c

abc

a  👈aが表示されました



アレサ「printf("%c\n", *p);


がポイントなんですの」


ソーラー「はは わかった(^_-)-☆


まず


ポインタ変数pは


文字列データ"abc"を格納しているメモリの先頭のアドレス


00DA7BDCを格納しており


00DA7BDCのアドレス番号の付いたメモリには


文字データ'a'が格納されているので


*pはポインタ変数pが格納しているアドレス00DA7BDCの付いたメモリに


格納されているデータを


この場合


文字データ'a'を表すことになるんだよ


もう1回


printf("%c\n",*p);


の命令文を見ると


*pに格納されている文字データ'a'をprintf出力表示するのに


文字をprintf出力表示するのにつかわれる


%c出力変換指定子が使われているのがわかるね。」


アレサ「はいっ そうなんですの\(^o^)/


ソーラーさん バトンタッチいたします」


ソーラー「へへ そう?


では


お待たせいたしました。


次はいよいよ


添字演算子[ ]の説明だね。


#include <stdio.h>


int main(void) {


char *p = "abc";


printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

printf("%s\n", p);

printf("%p\n", p);

return 0;


}


コンパイル結果

a

b

c

00DA7BDC

abc


ソーラー「今


ポインタ変数pにはアドレス00DA7BDCが格納されています


このとき


ポインタ変数pに


添字演算子[]


をつけて


p[0]

p[1]

p[2]


とした場合


p[0]は00DA7BDCのアドレス番号の付いたメモリに格納されている


文字データ'a'を表すことができるんだよ。


そして


p[1]は00DA7BDDのアドレス番号の付いたメモリに格納されている


文字データ'b'を表すことができ


p[2]は00DA7BDDのアドレス番号の付いたメモリに格納されている


文字データ'c'を表すことができるんだ。


なので

printf("%c\n", p[0]);

printf("%c\n", p[1]);

printf("%c\n", p[2]);

が実行されると


コンパイル結果

a

b

c

が表示されるんだね。」



アレサ「ソーラーさん つまり


char *p = "abc";


が実行されて


文字列データ"abc"がメモリに格納された場合


文字データ'a'の格納されたメモリ

文字データ'b'の格納されたメモリ

文字データ'c'の格納されたメモリ


に


ポインタ変数pに添字演算子を付けた


配列変数

p[0]

p[1]

p[2]

をつかって

アクセスし


配列変数




p[0]


p[1]


p[2]


が





文字データ'a'

文字データ'b'

文字データ'c'


をあらわすことができるというわけなのですね。」


































  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます