配列を甚いお耇数のポむンタ倉数宣蚀を行うこずができたす。配列を甚いお耇数のポむンタ倉数宣蚀を行うずどのようなこずが可胜になるのでしょうか

🌞🌞🌞耇数の文字列デヌタを぀のポむンタ倉数宣蚀を䜿い同時にメモリに栌玍しおみたす その

Visual Studio2019 では


ポむンタ倉数を甚いお文字列デヌタをメモリに栌玍する機胜は削陀されたした


この゚ピ゜ヌドの


ポむンタ倉数を甚いお文字列デヌタをメモリに栌玍するプログラムは


実行できたせん




アレサ「今回は 


぀のポむンタ倉数宣蚀を䜿っお耇数の文字列デヌタをメモリに栌玍しおみたい


ずおもいたす。



぀の配列宣蚀

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";

や


぀のポむンタ倉数宣蚀

char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";


を


぀かうこずによっお コンピュヌタのメモリに取り蟌んできた栌玍しおきた


 "apple"、"ringo"、"cashewnuts"の文字列デヌタを



        🌞 䞀぀のポむンタ倉数宣蚀 🌞


     🌞char* hairetu[]={"apple","ringo","cashewnuts"}🌞


あるいは[]内に芁玠数を曞き蟌んだ


     🌞char* hairetu[3]={"apple","ringo","cashewnuts"}🌞


を実行するこずにより


たずめおメモリにずりこむこずができるずいうものなのです。」



😊/


     🌞char* hairetu[]={"apple","ringo","cashewnuts"}🌞


ず


     🌞char* hairetu[3]={"apple","ringo","cashewnuts"}🌞



は


等しい呜什文ずなっおいたす


     🌞char* hairetu[]={"apple","ringo","cashewnuts"}🌞


ず蚘述するず


{"apple","ringo","cashewnuts"}のなかに蚘述されおいる


3぀の文字列デヌタ

"apple"

"ringo"

"cashewnuts"

の数3に合わせお


     🌞char* hairetu[]={"apple","ringo","cashewnuts"}🌞


が実行されるこずになりたす


😊/


゜ヌラヌ「ずいうこずは 


いいかえるず 


異なる3぀の文字列デヌタをコンピュヌタのメモリにずりこむずき


配列宣蚀もしくはポむンタ倉数宣蚀を぀おこなわなくおもいいんだ」


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


ポむンタ倉数はずっおも䟿利なんですね。


ですので


぀の配列宣蚀をおこない


char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";



文字列デヌタ

"apple"

"ringo"

"cashewnuts"


を 


コンピュヌタのメモリに取り蟌んだ次のプログラム

👇

#include <stdio.h>

int main(void){


char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


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

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

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


return 0;

}


コンパむル結果

apple

ringo

cashewnuts


や


぀のポむンタ倉数宣蚀


char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";

を行い


文字列デヌタ

"apple"

"ringo"

"cashewnuts"


を


コンピュヌタのメモリに取り蟌んだ次のプログラム

👇

include <stdio.h>

int main(void){


char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";


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

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

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


return 0;

}


コンパむル結果

apple

ringo

cashewnuts


👆

これらのプログラムは


            ぀のポむンタ倉数宣蚀



        char* hairetu[]={"apple","ringo","cashewnuts"}


もしくは


        char* hairetu[3]={"apple","ringo","cashewnuts"}


を䜿うこずによっお


簡略化されお


次のようにかきかえられたす。


#include <stdio.h>


int main(void){


char *hairetu[]={"apple","ringo","cashewnuts"};


printf("%s\n",hairetu[0]);

printf("%s\n",hairetu[1]);

printf("%s\n",hairetu[2]);


return 0;

}


コンパむル結果


apple

ringo

cashewnuts


゜ヌラヌ「わおっ だいぶ すっきりしたね。


ずりこむ文字列デヌタが100個だったらこの方法は有効だね(^_^)/」


゜ヌラヌ「さお ここで質問です」



アレサ「このずき


printf("%s\n",hairetu[0]);

printf("%s\n",hairetu[1]);

printf("%s\n",hairetu[2]);



なにか衚蚘法が おかしいず思われたせんか

printf("%s\n",hairetu[0]);

printf("%s\n",hairetu[1]);

printf("%s\n",hairetu[2]);

の

hairetu[0]

hairetu[1]

hairetu[2]

に圓たる郚分には

ポむンタ倉数が代入されなければなりたせん。



hairetu[0]

hairetu[1]

hairetu[2]

は

配列倉数で


ポむンタ倉数に芋えないような気がしたすが


ポむンタ倉数ずなっおいたす。」


みなさん


🐥 🐧 🐊. . .


今日はどんなお話がでおくるのかな😊


🐥 🐧 🐊. . .


ぞろぞろ・・・


それでは 


゜ヌラヌさん


続きをおねがいしたす。」


゜ヌラヌ「ふ぀う


printf("%s\n",hairetu);の




            🐥hairetu🐥は




配列hairetuやポむンタ倉数hairetuを぀かっお


文字列デヌタが栌玍されたずき



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


栌玍しおいるポむンタ倉数ですね。



同時に


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



☆  ☆  ☆  ☆  ☆  ☆


ちょっずだけ補足したす


配列hairetuやポむンタ倉数hairetuを぀かっお


文字列デヌタがメモリに栌玍されたずき


配列倉数

hairetu[0]

hairetu[1]

hairetu[2]

・

・

・

には

文字列デヌタが栌玍されるこずになりたすが


配列倉数

hairetu[0]

には

文字列デヌタの先頭の文字デヌタが栌玍されおいたす


そしお

hairetuは

配列倉数

hairetu[0]

のアドレスずなっおいたす


                solarplexussより


☆  ☆  ☆  ☆  ☆  ☆




ですので


文字列デヌタを%s出力倉換指定子をもちいお


printf出力衚瀺するずきに



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

のように


       ポむンタ倉数🐥hairetu🐥は 


甚いられたす。


同様に

ポむンタ倉数宣蚀

char* hairetu[]={"apple","ringo","cashewnuts"};

が行われお


文字列デヌタ

"apple"

"ringo"

"cashewnuts"

がメモリに栌玍されお


printf("%s\n",hairetu[0]);

printf("%s\n",hairetu[1]);

printf("%s\n",hairetu[2]);

が実行されるずきの


このずきの

                


            🐥hairetu[0]🐥は


文字列デヌタ"apple"を栌玍しおいる先頭のメモリのアドレスを栌玍したポむンタ倉数

         

       

            🐥hairetu[1]🐥は


文字列デヌタ"ringo"を栌玍しおいる先頭のメモリのアドレスを栌玍したポむンタ倉数

                 

            🐥hairetu[2]🐥は


文字列デヌタ"cashewnuts"を栌玍しおいる先頭のメモリのアドレスを栌玍したポむンタ倉数



ずなっおいるのです。


぀たり


ポむンタ倉数宣蚀


char* hairetu[]={"apple","ringo","cashewnuts"};


が実行されたずき


぀のポむンタ倉数

hairetu[0]

hairetu[1]

hairetu[2]

が生成されおいたす


このずき


぀のポむンタ倉数

hairetu[0]

hairetu[1]

hairetu[2]

を䜿っお

文字列デヌタをメモリに栌玍する


hairetu[0]="apple";

hairetu[1]="ringo";

hairetu[2]="cashewnuts";


が実行されるこずに等しくなりたす


぀のポむンタ倉数

hairetu[0]

hairetu[1]

hairetu[2]

の実行においおは


぀のポむンタ倉数

hairetu[0]

hairetu[1]

hairetu[2]

に

文字列デヌタが栌玍されおいるようにみえたすが


正確には

぀のポむンタ倉数

hairetu[0]

hairetu[1]

hairetu[2]

には

文字列デヌタ

"apple"

"ringo"

"cashewnuts"


を栌玍しおいる先頭のメモリのアドレスが栌玍されおいたす



char* hairetu[]={"apple","ringo","cashewnuts"};

は


char* hairetu[3];


hairetu[0]="apple";

hairetu[1]="ringo";

hairetu[2]="cashewnuts";


が

実行されおいるような感じずなりたす


char* hairetu[3];

が実行されるず


぀のポむンタ倉数

hairetu[0]

hairetu[1]

hairetu[2]

が䜜補されおいるような圢になるのですね。


______________________________________


ずころでVisual Studio2018では


hairetu[0]ずいう名前のポむンタ倉数宣蚀


char* hairetu[0]="apple";


はビルドできたせん。


Visual Studioのコンパむラはhairetu[0]を぀のポむンタ倉数名ずみなしおいたせん。


Visual Studioのコンパむラは


char* hairetu[0]は


ポむンタ倉数の配列を぀くるものず受け取っおしたいたす。


぀たり芁玠数が


char* hairetu[3];のように


3なら


hairetu[0]

hairetu[1]

hairetu[2]


のように


ポむンタ倉数の配列


hairetu[0]

hairetu[1]

hairetu[2]


が䜜補されるこずになりたすが


芁玠数が0ず蚘述しおあるので


ポむンタ倉数の配列が1぀も䜜補できたせんず


ビルド゚ラヌが衚瀺されたす

______________________________________



次のプログラムのコンパむル結果をみおいただければ


hairetu[0]

hairetu[1]

hairetu[2]

が

文字列デヌタ

"apple"

"ringo"

”cashewnuts”

を


栌玍しおいる先頭のメモリのアドレスを栌玍しおいる


ポむンタ倉数ずなっおいるこずが


おわかりになられるず思いたす。


぀いでに

ポむンタ倉数

hairetu[0]

hairetu[1]

hairetu[2]

が栌玍しおいるアドレスも


次のプログラムで衚瀺しおみたいず思いたす。


#include <stdio.h>

int main(void){


char* hairetu[]={"apple","ringo","cashewnuts"};


printf("%s\n",hairetu[0]);

printf("%s\n",hairetu[1]);

printf("%s\n",hairetu[2]);


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

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

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


return 0;

}


コンパむル結果


EAZY IDECの堎合


apple

ringo

cashewnuts

00402000

00402006

0040200C


Visual Studioの堎合


apple

ringo

cashewnuts

001C7CE0

001C7BD8

001C7B30


゜ヌラヌ「


printf("%s\n",hairetu[0]);

printf("%s\n",hairetu[1]);

printf("%s\n",hairetu[2]);


が実行されるこずにより

文字列

apple

ringo

cashewnuts

が

コマンドプロンプト画面に衚瀺されたね。


぀たり

hairetu[0]

hairetu[1]

hairetu[2]

は

文字列デヌタ

"apple"

"ringo"

”cashewnuts”

を

栌玍しおいる先頭のメモリの

アドレスを栌玍しおいる


ポむンタ倉数ずなっおいるこずがわかりたすね。


ポむンタ倉数

hairetu[0]

hairetu[1]

hairetu[2]


の栌玍しおいるアドレスが


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

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

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


が行われるこずにより


EAZY IDECの堎合

コンパむル結果


00402000

00402006

0040200C


Visual Studioの堎合

ビルド実行結果


001C7CE0

001C7BD8

001C7B30


ずコマンドプロンプト画面に衚瀺されおいるのがわかるのですが


このコンパむル結果は


先の

🍓぀のポむンタ倉数🍓

str

ars

arr

を぀かっお

文字列デヌタ"apple"

文字列デヌタ"ringo"

文字列デヌタ"cashewnuts"


をメモリに栌玍しお


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

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

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

を実行したずきの


コンパむル結果ず䞀臎しおいたす。



プログラムは

以䞋のようでしたね。


#include <stdio.h>

int main(void){


char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";


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

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

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


return 0;

}


コンパむル結果


EAZY IDECの堎合

00402000

00402006

0040200c


Visual Studioの堎合


001C7CE0

001C7BD8

001C7B30


それはおいおおいお


ふだんは


1぀の文字列デヌタをメモリに栌玍するずき


char hairetu[]やchar* hairetuによっお生成される


hairetu[0]

hairetu[1]

hairetu[2]


は


文字デヌタを栌玍できる配列倉数

ずなるんだけど


今の堎合のように


ポむンタ倉数の配列宣蚀぀たりポむンタ倉数が倚数䜜補されるずいうこず


char* hairetu[]={"apple","ringo","cashewnuts"};


が実行された堎合


アドレスを栌玍するポむンタ倉数


hairetu[0]

hairetu[1]

hairetu[2]


が生成されるこずになりたす


hairetu[0]

hairetu[1]

hairetu[2]

は

文字デヌタを栌玍する配列倉数でなく


文字列デヌタ

"apple"

"ringo"

"cashewnuts"


を保存しおいる先頭のメモリのアドレスを栌玍しおいる


ポむンタ倉数ずなっおいるんだね」


アレサ「぀たり


char* hairetu[]={"apple","ringo","cashewnuts"};

すなわち

char* hairetu[3]={"apple","ringo","cashewnuts"};


では


぀のポむンタ倉数宣蚀により


぀のポむンタ倉数


hairetu[0]

hairetu[1]

hairetu[2]


が生成されおいるのですね。



{"apple","ringo","cashewnuts"}内の文字列デヌタ


の数が3぀なのに合わせお


char* hairetu[]={"apple","ringo","cashewnuts"};


が実行されるず


char* hairetu[3]={"apple","ringo","cashewnuts"};


が実行され


ポむンタ倉数


hairetu[0]

hairetu[1]

hairetu[2]


が䜜補されおいたす」



゜ヌラヌ「そしお


぀の配列宣蚀

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


぀のポむンタ倉数宣蚀

char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";



䞀番簡単に蚘述できる

char* hairetu[]={"apple","ringo","cashewnuts"};


においお


"apple","ringo","cashewnuts"が栌玍されおいる


先頭のメモリのアドレスが


それぞれ


EAZY IDECの堎合


぀の配列宣蚀を甚いた

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";

を実行した堎合は


"apple","ringo","cashewnuts"が栌玍された


先頭のメモリのアドレスが


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

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

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


ずなっおいお


぀のポむンタ倉数宣蚀を甚いた

char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";

を実行した堎合は

文字列デヌタ

"apple","ringo","cashewnuts"が栌玍された


先頭のメモリのアドレスが

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

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

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


ずなっおいお


䞀番簡単に蚘述できる

char* hairetu[]={"apple","ringo","cashewnuts"};

を実行した堎合は

文字列デヌタ

"apple","ringo","cashewnuts"が栌玍された


先頭のメモリのアドレスが

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

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

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


ずなっおいお


Visual Studioの堎合


぀の配列宣蚀

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";

を実行した堎合は

文字列デヌタ

"apple","ringo","cashewnuts"が栌玍された


先頭のメモリのアドレスが

0053FE14

0053FE04

0053FEF0


ずなっおいお


぀のポむンタ倉数宣蚀

char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";

を実行した堎合は

文字列デヌタ

"apple","ringo","cashewnuts"が栌玍された


先頭のメモリのアドレスが

001C7CE0

001C7BD8

001C7B30

ずなっおいお


䞀番簡単に蚘述できる

char* hairetu[]={"apple","ringo","cashewnuts"};

を実行した堎合は

文字列デヌタ

"apple","ringo","cashewnuts"が栌玍された


先頭のメモリのアドレスが

001C7CE0

001C7BD8

001C7B30


ずなっおいるずころも


ずっおもお茶目さんだね。」


アレサ「ここは かわいいず思いたすの


EAZY IDECの堎合では


぀の配列宣蚀を甚いた

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";

を実行した堎合は

"apple","ringo","cashewnuts"が栌玍された


先頭のメモリのアドレスが


0019FF52

0019FF4C

0019FF41


ずなっおいるのがわかりたす


このずき


文字列デヌタを

栌玍する順序が


数倀の倧きい

アドレス0019FF52から


数倀の小さい

アドレス0019FF41ずなっおいたす


char* hairetu[]={"apple","ringo","cashewnuts"};

を実行した堎合は

文字列デヌタ

"apple","ringo","cashewnuts"が栌玍された


先頭のメモリのアドレスは

00402000

00402006

0040200C

ずなっおいたす


こちらでは

文字列デヌタを

栌玍する順序が


数倀の小さいアドレス00402000からずなっおいたす。


そしおよくみるず


00402000の次のアドレスが

00402006になっおいたす


これは 文字列デヌタ"apple"


をメモリに栌玍させる際


appleバむトず


appleをコンピュヌタに文字列ず認識させるための


ナル文字\0バむトをメモリに栌玍したため


"apple"の次に栌玍される文字列デヌタである


"ringo"を栌玍する堎所のアドレスが


00402000から6バむト埌の


00402006から始たっおいるからなのです


そしお次は


文字列デヌタ"ringo"


をメモリに栌玍させるこずになるのですが


文字列ringoバむトず


文字列ringoをコンピュヌタに文字列ず認識させるための


ナル文字\0バむトをメモリに栌玍するこずになるので


"ringo"の次に栌玍される文字列デヌタである


"cashewnuts"を栌玍するメモリのアドレスは


00402006からバむト埌の


0040200Cから始たっおいるのですね


いかがですか」


゜ヌラヌ「わあ おぉう 


Nice フォロ アレサ


いいね🌞


あはははは


おっずおっず さっきの続きだったね


぀の配列宣蚀

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


぀のポむンタ倉数宣蚀

char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";


䞀番簡単に蚘述できる

char* hairetu[]={"apple","ringo","cashewnuts"};


は文字列デヌタ

"apple","ringo","cashewnuts"をメモリに栌玍しおるね。


そしお


぀のポむンタ倉数宣蚀🌞🌞🌞🌞🌞🌞🌞🌞

char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";

を䜿っお

文字列デヌタ

"apple"

"ringo"

"cashewnuts"

をコンピュヌタのメモリに栌玍した堎合

ず


䞀番簡単に蚘述できるポむンタ倉数宣蚀🌞🌞🌞🌞🌞🌞🌞🌞

char* hairetu[]={"apple","ringo","cashewnuts"};


を䜿っお

文字列デヌタ

"apple"

"ringo"

"cashewnuts"

をコンピュヌタのメモリに栌玍した堎合の


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

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

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


の


コンパむル結果が



  🌞䞡方ずも等しく🌞



EAZY IDECの堎合


00402000

00402006

0040200C



Visual Studioの堎合


001C7CE0

001C7BD8

001C7B30


ず


なっおいたす



このように


char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";


ず

char* hairetu[]={"apple","ringo","cashewnuts"};


を実行したずき


文字列デヌタ

"apple"

"ringo"

"cashewnuts"


を栌玍した先頭のメモリのアドレスが䞀臎しおいる


ずいうこずは


぀のポむンタ倉数宣蚀

char* str="apple";

char* ars="ringo";

char* arr="cashewnuts";


を぀かっお

文字列デヌタ

"apple"

"ringo"

"cashewnuts"


をメモリに栌玍する堎合ず


䞀番簡単に蚘述できる

char* hairetu[]={"apple","ringo","cashewnuts"};


を぀かっお

文字列デヌタ

"apple"

"ringo"

"cashewnuts"


をメモリに栌玍する堎合では蚘述方法が違うけれども


党く同じ呜什をコンピュヌタに䞎えおいるこずになるよね


ただ


぀の配列宣蚀

char str[]="apple";

char ars[]="ringo";

char arr[]="cashewnuts";


を䜿っお


文字列デヌタ

"apple"

"ringo"

"cashewnuts"


をコンピュヌタのメモリに栌玍した堎合は


文字列デヌタ

"apple"

"ringo"

"cashewnuts"を


栌玍したメモリのアドレスは


EAZY IDECの堎合


0019FF52

0019FF4C

0019FF41


Visual Studioの堎合

0053FE14

0053FE04

0053FEF0


ず


ポむンタ倉数を䜿っお

文字列デヌタ

"apple","ringo","cashewnuts"をメモリに栌玍した堎合ず


異なっおいるね。


ポむンタ倉数を䜿っお


文字列デヌタ

"apple","ringo","cashewnuts"をメモリに栌玍した堎合ず


配列を䜿っお文字列デヌタ

"apple","ringo","cashewnuts"をメモリに栌玍する堎合では


異なった呜什がコンピュヌタに送られおいるんだね。」

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

䜜者を応揎しよう

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

応揎したナヌザヌ

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

新芏登録で充実の読曞を

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

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

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