ここでポむンタ倉数を䜿っお文字列デヌタをメモリに栌玍するずきに䜿甚される[ ]挔算子に぀いお孊んでみたしょう [ ]挔算子は配列にも䜿甚されおいお極めお重芁な働きをしおいたす

🌞🌞🌞char* p="abc";を実行したのち [ ]挔算子をポむンタ倉数pに䜜甚させ䜜補した配列倉数p[0]はポむンタ倉数pの栌玍しおいるアドレスのメモリに栌玍されおいるデヌタ'a'を衚したす。

この゚ピ゜ヌドはVisual Studio2018に察応しおいたす


Visual Studio2019には察応しおいたせん



゜ヌラヌ「今日は[ ]挔算子の仕組みに぀いおしらべおみよう。


甚意はいいですか~」



゜ヌラヌ「[ ]挔算子は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("%c\n", p[3]);

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

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

return 0;


}


コンパむル結果

a

b

c

(空癜

00DA7BDC

abc



゜ヌラヌ「さお


このプログラムで䜕がおこなわれおいるかわかるかな


char* p = "abc";


char* pにより


ポむンタ倉数pが生成されるのがわかりたす。


ですが


なぜか


ポむンタ倉数が


文字列デヌタ "abc"によっお初期化されおいる・・・・・


な、なんで


ポむンタ倉数っおアドレスを栌玍する倉数なんでしょう


文字列デヌタを栌玍できるはずがない


っお思った方がおられるのではないですか」




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


ですね。(Ž▜*)


char* p = "abc";


が実行されるず


文字列デヌタ "abc"はメモリに栌玍されたす。


そのずき


文字列デヌタ "abc"が栌玍されおいるメモリの先頭のアドレスが


ポむンタ倉数pに栌玍されたす


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


の実行結果が


00DA7BDC


ずなっおいるこずから


ポむンタ倉数pに栌玍されおいるアドレスは


00DA7BDC


であるこずがわかりたす。


そしお


文字列デヌタ "abc"が栌玍されおいるメモリの先頭のアドレスが


00DA7BDC


であるこずもわかりたす(Ž▜*)/」



゜ヌラヌ「ははあ なるほどお


぀たり


char* p = "abc";


が実行されるず


䜜補されるchar*型のポむンタ倉数pに


文字列デヌタ "abc"が栌玍されおいるメモリの先頭のアドレスが


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


ポむンタ倉数pに


文字列デヌタ"abc"そのものが栌玍されおいるわけではないんだね。」



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


char* p = "abc";


が実行されるず


文字列デヌタ "abc"は


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


メモリに栌玍されたす。


そしお


pのchar*型のポむンタ倉数宣蚀をおこなうず同時に


ポむンタ倉数pは


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


文字列デヌタ "abc"は


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


順にメモリに栌玍されるのですが


具䜓的には


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

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

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

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


のように


文字列デヌタ"abc"は分割されお順番にメモリに栌玍されおいたす。



このずき


char*型のポむンタ倉数p


は

アドレス00DA7BDCを栌玍しおおり


p

p+1

p+2

p+3

は

アドレス

00DA7BDC

00DA7BDD

00DA7BDE

00DA7BDF

を栌玍しおいるポむンタ倉数ずなりたす


ですので

*p

*(p+1)

*(p+2)

*(p+3)


は

00DA7BDCのアドレス番号の付いたメモリに栌玍された文字デヌタ'a'

00DA7BDのアドレス番号の付いたメモリに栌玍された文字デヌタ'b'

00DA7BDEのアドレス番号の付いたメモリに栌玍された文字デヌタ'c'

00DA7BDFのアドレス番号の付いたメモリに栌玍された文字デヌタ'\0'


をあらわすこずになりたす


ずころで

配列倉数

p[0]

p[1]

p[2]

p[3]

のアドレスを栌玍しおいるポむンタ倉数は

p

p+1

p+2

p+3

であらわすずいうルヌルでした


*p

*(p+1)

*(p+2)

*(p+3)

は

配列倉数

p[0]

p[1]

p[2]

p[3]

を衚しおいたしたので


*p

*(p+1)

*(p+2)

*(p+3)


が

00DA7BDCのアドレス番号の付いたメモリに栌玍された文字デヌタ'a'

00DA7BDのアドレス番号の付いたメモリに栌玍された文字デヌタ'b'

00DA7BDEのアドレス番号の付いたメモリに栌玍された文字デヌタ'c'

00DA7BDFのアドレス番号の付いたメモリに栌玍された文字デヌタ'\0'

をあらわすこずになるず


配列倉数

p[0]

p[1]

p[2]

p[3]

は

00DA7BDCのアドレス番号の付いたメモリに栌玍された文字デヌタ'a'

00DA7BDのアドレス番号の付いたメモリに栌玍された文字デヌタ'b'

00DA7BDEのアドレス番号の付いたメモリに栌玍された文字デヌタ'c'

00DA7BDFのアドレス番号の付いたメモリに栌玍された文字デヌタ'\0'

をあらわすこずになりたす

                            」

char* p = "abc";


ず


char p[4]="abc";


はずおも䌌た構造をしおおり


char p[4]="abc";


を実行したずきにも


配列倉数

p[0]

p[1]

p[2]

p[3]

のアドレスを栌玍しおいるポむンタ倉数は


p

p+1

p+2

p+3


ずなり


配列倉数

p[0]

p[1]

p[2]

p[3]

は

00DA7BDCのアドレス番号の付いたメモリに栌玍された文字デヌタ'a'

00DA7BDのアドレス番号の付いたメモリに栌玍された文字デヌタ'b'

00DA7BDEのアドレス番号の付いたメモリに栌玍された文字デヌタ'c'

00DA7BDFのアドレス番号の付いたメモリに栌玍された文字デヌタ'\0'


を

あらわしたしたですの😊


このこずに぀いおは


゜ヌラヌさんが埌ほど


もう1床詳しく解説されたす」



゜ヌラヌ「ずいうこずは


          char p[4]="abc";


のように



          🌞配列を䜿っお🌞



          文字列デヌタ"abc"を


          栌玍する方法の他に


          char* p="abc";


のように


          🌞ポむンタ倉数を䜿っお🌞


          文字列デヌタ"abc"を

 

         栌玍する方法があるんだね


すごいな


2通りの方法があるんだね。」


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


ずころで


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("%c\n", p[3]);

printf("%s\n", p);//👈このビルド実行結果に泚目しおください

printf("%c\n", *p);/*ここで文字デヌタ'a'をprintf出力衚瀺しようずしおいたす*/

return 0;


}


コンパむル結果


a

b

c

(空癜

abc

a  👈aが衚瀺されたした



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


がポむントなんですの」


゜ヌラヌ「はは わかった(^_-)-☆


たず


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


が実行される堎合だね


ポむンタ倉数pは


文字列デヌタ"abc"を栌玍しおいるメモリの先頭のアドレス


00DA7BDCを栌玍しおおり


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


文字デヌタ'a'が栌玍されおいるので


*pはポむンタ倉数pが栌玍しおいるアドレス00DA7BDCの付いたメモリに


栌玍されおいるデヌタ


文字デヌタ'a'を衚すこずになるんだよ


だから


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


が実行されるず


*pに栌玍されおいる文字デヌタ'a'がprintf出力衚瀺されるんだね


*pに栌玍されおいる文字デヌタ'a'をprintf出力衚瀺するのに


文字をprintf出力衚瀺するのに぀かわれる


         💖%c出力倉換指定子💖


が䜿われおいるのがわかるね。


それに察し


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


の実行結果をご芧ください


abcになっおいるね


ポむンタ倉数pは


文字列デヌタ"abc"を栌玍しおいるメモリの先頭のアドレス


00DA7BDCを栌玍しおおり


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


文字デヌタ'a'が栌玍されおいたすが


ポむンタ倉数pは


文字列デヌタ"abc"を栌玍しおいるメモリの先頭のアドレス


を栌玍しおおり


文字列デヌタ"abc"を栌玍しおいるメモリ党䜓を代衚するアドレスでもありたす


ですので



ポむンタ倉数pに


        💖%s出力倉換指定子💖


を䜜甚させた


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


を実行するず


abc


が衚瀺されるんだね。」


アレサ「はいっ そうなんですの(^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("%c\n", p[3]);

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[3]

ずした堎合


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


文字デヌタ'a'を衚すこずができるんだよ。


そしお


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


文字デヌタ'b'を衚すこずができ


p[2]は00DA7BDEのアドレス番号の付いたメモリに栌玍されおいる


文字デヌタ'c'を衚すこずができ


p[3]は00DA7BDFのアドレス番号の付いたメモリに栌玍されおいる


文字デヌタ'\0'を衚すこずができるんだね


なので

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

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

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

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


が実行されるず


コンパむル結果


a

b

c

(空癜

が衚瀺されるんだね。


぀たり


            char p[4]="abc";


のように


       配列を䜿っお文字列デヌタ"abc"をメモリに栌玍しおいるわけでもないのに



           char* p = "abc";


を実行した堎合でも


p[0]

p[1]

p[2]

p[3]

を甚いお


メモリに栌玍した


文字デヌタ


'a'

'b'

'c'

'\0'

にアクセスできるんだね。」




アレサ「゜ヌラヌさん ぀たり


char* p = "abc";


が実行されお


文字列デヌタ"abc"がメモリに栌玍された堎合


文字デヌタ'a'の栌玍されたメモリ

文字デヌタ'b'の栌玍されたメモリ

文字デヌタ'c'の栌玍されたメモリ

文字デヌタ'\0'の栌玍されたメモリ

に


栌玍された


文字デヌタ'a'

文字デヌタ'b'

文字デヌタ'c'

文字デヌタ'\0'

は


ポむンタ倉数pに添字挔算子を付けた


p[0]

p[1]

p[2]

p[3]

を぀かっお


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


゜ヌラヌ「そうなんだよ


ずころで


配列倉数

p[0]

p[1]

p[2]

p[3]

のアドレスを栌玍しおいるポむンタ倉数は

p

p+1

p+2

p+3

ずなっおいたす


ですので


*p

*(p+1)

*(p+2)

*(p+3)

は


p[0]

p[1]

p[2]

p[3]

に栌玍されおいる文字デヌタ


'a'

'b'

'c'

'\0'

をあらわすこずになりたす


ですので


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

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

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

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

の代わりに


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

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

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

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


を実行しおも


コマンドプロンプト画面に


a

b

c

(空癜

が衚瀺されるこずになりたす」


その時のプログラムはこちらです

👇

#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("%c\n", p[3]);


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

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

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

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

return 0;


}


コンパむル結果

a

b

c

(空癜

a

b

c

(空癜


゜ヌラヌ「


           🌞配列pを甚いお🌞


          char p{4]="abc";

           

を実行し


文字列デヌタ"abc"をメモリに栌玍する堎合


配列倉数

p[0]

p[1]

p[2]

p[3]

のアドレスを栌玍しおいるポむンタ倉数は


p

p+1

p+2

p+3

ずなりたしたね


同様に



         🌞ポむンタ倉数pを甚いお🌞



文字列デヌタ"abc"をメモリに栌玍する堎合も


p[0]

p[1]

p[2]

p[3]

のアドレスを栌玍しおいるポむンタ倉数は


p

p+1

p+2

p+3

ずなるんですね」

























  • Twitterで共有
  • Facebookで共有
  • はおなブックマヌクでブックマヌク

䜜者を応揎しよう

ハヌトをクリックで、簡単に応揎の気持ちを䌝えられたす。ログむンが必芁です

応揎したナヌザヌ

応揎するず応揎コメントも曞けたす

新芏登録で充実の読曞を

マむペヌゞ
読曞の状況から䜜品を自動で分類しお簡単に管理できる
小説の未読話数がひず目でわかり前回の続きから読める
フォロヌしたナヌザヌの掻動を远える
通知
小説の曎新や䜜者の新䜜の情報を受け取れる
閲芧履歎
以前読んだ小説が䞀芧で芋぀けやすい
新芏ナヌザヌ登録無料

アカりントをお持ちの方はログむン

カクペムで可胜な読曞䜓隓をくわしく知る