異なるポインタ変数を一度に大量に作製してみよう

ソーラー「みなさん 今日は優雅に


ポインタ変数を使ってメモリに文字列データを格納してみたいと思います


 用意はいいですか~~~」


アレサ「はい😊 わかりました」


ソーラー「ではでは


みなさん


ポインタ変数宣言


char *a

char *b

char *c


を実行して


ポインタ変数


a

b

c


を作製し


a="lemon";

b="orange";

c="apple";


と実行することにより


メモリに


文字列データ

"lemon"

"orange"

"apple"


を格納してみたいと思います


このとき


文字列データ

"lemon"を格納しているメモリの先頭のアドレス



ポインタ変数aに


文字列データ

"orange"を格納しているメモリの先頭のアドレス



ポインタ変数bに



文字列データ

"apple"を格納しているメモリの先頭のアドレス



ポインタ変数cに


格納されることになります


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

👇


#include <stdio.h>


int main() {


char *a;

char *b;

char *c;


a="lemon";

b="orange";

c="apple";



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

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

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

return 0;


}


ビルド実行結果

lemon

orange

apple


ソーラー「どうですか


ポインタ変数を使って文字列データをメモリに格納することができましたね


ところで


この


ポインタ変数a

ポインタ変数b

ポインタ変数c




          異なるポインタ変数ですね




アレサ「うふふ


ソーラーさん


ポインタ変数a

ポインタ変数b

ポインタ変数c




         💖異なるポインタ変数ですね💖


って


もちろん


ポインタ変数a

ポインタ変数b

ポインタ変数c



異なるポインタ変数ですね」


ソーラー「あっ そうだったね


ところで


みなさん



ポインタ変数宣言


char *a

char *b

char *c


を実行して


ポインタ変数


a

b

c


を作製するのはすこし手間ですね


そこで


char *a[3]


を実行することにより


ポインタ変数


a[0]

a[1]

a[2]


を作製し


ポインタ変数


a[0]

a[1]

a[2]


を作製し


ポインタ変数


a[0]

a[1]

a[2]



文字列データ

"lemon"

"orange"

"apple"


a[0]="lemon";

a[1]="orange";

a[2]="apple";


を代入することにより


メモリに文字列データ


"lemon"

"orange"

"apple"


を格納してみたいと思います


このとき


文字列データ

"lemon"を格納しているメモリの先頭のアドレス



ポインタ変数a[0]に


文字列データ

"orange"を格納しているメモリの先頭のアドレス



ポインタ変数a[1]に



文字列データ

"apple"を格納しているメモリの先頭のアドレス



ポインタ変数a[2]に


格納されることになります


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

👇


#include <stdio.h>


int main() {



char *a[3] ;


a[0]="lemon";

a[1]="orange";

a[2]="apple";


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

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

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

return 0;


}



ビルド実行結果

lemon

orange

apple


ソーラー「


文字列データ

"lemon"を格納しているメモリの先頭のアドレスを格納しているポインタ変数

a[0]


文字列データ

"orange"を格納しているメモリの先頭のアドレスを格納しているポインタ変数

a[1]


文字列データ

"apple"を格納しているメモリの先頭のアドレスを格納しているポインタ変数

a[2]


%s出力変換指定子を作用させた


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

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

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

を実行することにより


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


lemon

orange

apple

が表示されていますね




ポインタ変数宣言

char *a[3] ;


a[0]="lemon";

a[1]="orange";

a[2]="apple";

をまとめて


ポインタ変数宣言、初期化を同時に


char *a[3] = { "lemon","orange","apple" };


と実行することができます


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

👇

#include <stdio.h>


int main() {



char *a[3] = { "lemon","orange","apple" };


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

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

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

return 0;


}



ビルド実行結果

lemon

orange

apple





アレサ「ソーラーさん


このプログラムで用いられている


char *a[3] = { "lemon","orange","apple" };


では何が実行されているのでしょうか?


char *a[3]は何を意味しているのですの?」


ソーラー「これは以前のエピソードでも登場してきたね


char *a[3]が実行されると


ポインタ変数が3つ生成されるんだよ」


アレサ「ポインタ変数が3つ生成されるのですか?


では


char *a[3]はポインタ変数宣言なのですか?」


ソーラー「そうなんだ\(^o^)/




           char *a[3]


をよくみてね


           char *a[3]    


では


アスタリスク演算子*



[]演算子の2つが用いられていますね



アレサ「はい😊


           char *a[3]       



アスタリスク演算子*



[]演算子の2つが用いられています」


ソーラー「それでは


アスタリスク演算子*



[]演算子



どちらが先に


            a


に作用すると思いますか?」


アレサ「え?


どちらの演算子が先にaに作用するかですか?


char *a[3]   



演算子の作用する順序、順番があるのですか?」


ソーラー「そうなんです


           char *a[3]


のように


           a



アスタリスク演算子*



[]演算子が作用している場合


先に


[]演算子が


            a


に作用することになります



つまり



[]演算子の方が*演算子より実行される優先度が高いというわけです」


アレサ「ということは


           char *a[3]


では


             a[3]


が先に実行されるということですか?」


ソーラー「そうなんです 驚いた?(*´▽`*)


ですから


           char *a[3]


では


             a[3]


の働きにより


a[0]

a[1]

a[2]

が生成されることになります


そして


この


a[0]

a[1]

a[2]



*演算子が作用することになります


ので


あたかもポインタ変数宣言


           char *(a[0]);

           char *(a[1]);

           char *(a[2]);


が実行されて


char*型のポインタ変数


a[0]

a[1]

a[2]


が作製されることになります」


アレサ「そういう仕組みだったのですの」


ソーラー「そして


a[0]

a[1]

a[2]


はポインタ変数なので


これらのポインタ変数を用いて


メモリに


文字列データを格納することができます



このプログラムでは


ポインタ変数宣言、初期化


char *a[3] = { "lemon","orange","apple" };


が実行されることにより


a[0]="lemon";

a[1]="orange";

a[2]="apple";


が実行されています



ここで


ポインタ変数宣言、初期化


char *a[3] = { "lemon","orange","apple" };



ポインタ変数宣言


char *a[3] ;



初期化


a[0]="lemon";

a[1]="orange";

a[2]="apple";


の部分とに


分割して実行してみたいと思います


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

👇


#include <stdio.h>


int main() {



char *a[3] ;


a[0] = "lemon";

a[1] = "orange";

a[2] = "apple";



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

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

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

return 0;


}


ビルド実行結果

lemon

orange

apple


ソーラー「ポインタ変数宣言


char *a[3] ;


と初期化


a[0]="lemon";

a[1]="orange";

a[2]="apple";



分割してもちゃんとプログラムを実行することができました


つまり


char *a[3] ;


が実行されると


ポインタ変数


a[0]

a[1]

a[2]



生成されています


ポインタ変数


a[0]

a[1]

a[2]

が整然と並んでいますね


ですが


a[0]

a[1]

a[2]


は異なるポインタ変数です」


アレサ「ソーラーさん


a[0]

a[1]

a[2]


はもちろん


異なるポインタ変数なのではないですか?」













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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る