配列変数a[i]のアドレスを格納しているポインタ変数はポインタ変数aにiを足したアドレス演算a+iで表されます 

アドレス演算とはアドレスを格納しているポインタ変数に数値を普通の数値計算のように数値を足したり引いたりすることです その式は配列変数のアドレスを格納するポインタ変数となります

アレサ「ソーラーさん


ポインタ変数aをもちいれば


文字列データをメモリに格納することができました


(ポインタ変数をもちいて


文字列データをメモリに格納することができるのは


Visual Studio2018以前のバージョンとなっています


Visual Studio2019では実行することができません)


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

👇


#include <stdio.h>


int main() {


char* a="cat";


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

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

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

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


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

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

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

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


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


return 0;


}



ビルド実行結果


c

a

t

(空白)

00456B94

00456B95

00456B96

00456B97

00456B94


アレサ「はい


char* a="cat";


が実行されるとき


文字列データ"abc"



アドレス00456B94のメモリに'a'

アドレス00456B95のメモリに'b'

アドレス00456B96のメモリに'c'

アドレス00456B97のメモリに'\0'


のように


格納されますが


そのメモリの先頭のアドレス00456B94が


ポインタ変数aに格納されます


char型の配列変数

a[0]

a[1]

a[2]

a[3]


'a'

'b'

'c'

'\0'

を格納しているメモリに


アクセスし


char型の配列変数

a[0]

a[1]

a[2]

a[3]


'a'

'b'

'c'

'\0'


をあらわすことになりますの」


ソーラー「うん😊 そうだったね


このとき


a[0]のアドレスを格納しているポインタ変数はa

a[1]のアドレスを格納しているポインタ変数はa+1

a[2]のアドレスを格納しているポインタ変数はa+2

a[3]のアドレスを格納しているポインタ変数はa+3


となります


何でポインタ変数aに1や2を足し合わせることができるの?


と思った方もおられるかもしれませんね


このように



  ポインタ変数aに数値を足し合わせる様な計算をおこなうことを



          🌞ポインタ演算🌞



といいます


          🌞ポインタ演算🌞


を用いて


生成された


a

a+1

a+2

a+3



         char型の配列変数


a[0]

a[1]

a[2]

a[3]

のアドレス


を格納したポインタ変数になります


ですので

ポインタ変数

a

a+1

a+2

a+3

                            」

にアスタリスク演算子*


を用いた


*a

*(a+1)

*(a+2)

*(a+3)



a[0]

a[1]

a[2]

a[3]


を表すことになります



このポインタ演算のおもしろいところは


配列変数a[0]のアドレスを格納しているポインタ変数aに1を足し合わせた


           a+1



配列変数a[1]のアドレスを格納しているポインタ変数となっているというところです



つまり

char型の配列変数

a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]


が存在しているとして


a[0]のアドレスを格納しているポインタ変数はa


となりますが


char型の配列変数a[0]のアドレスを格納しているポインタ変数aに1を足し合わせた


           a+1




       🌞char型の配列変数a[0]の次の配列変数a[1]🌞



のアドレスを格納しているポインタ変数となります



この           🌞次🌞


というところがポイントなんだよ」


solarplexuss「ど~いうこと~」



ところで次のプログラムをご覧ください

👇

#include <stdio.h>


int main() {


int a[6];



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

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

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

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

printf("%p\n", &a[4]);

printf("%p\n", &a[5]);



return 0;


}


ビルド実行結果


0099FDC8

0099FDCC

0099FDD0

0099FDD4

0099FDD8

0099FDDC


👆

このプログラムのように


int型の配列宣言


int a[6];


を実行したなら


int型の配列変数


a[0]

a[1]

a[2]

a[3]

a[4]

a[5]


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


int型の配列変数a[0]のアドレスを格納しているポインタ変数aに1を足し合わせた


           a+1





      int型の配列変数a[0]の💖のint型の配列変数a[1]




のアドレスを格納しているポインタ変数となります



つまり


 ポインタ変数


        a+1


の格納しているアドレスは


配列変数a[0]のアドレス0099FDC8

配列変数a[1]のアドレス0099FDCC👈

配列変数a[2]のアドレス0099FDD0

配列変数a[3]のアドレス0099FDD4

配列変数a[4]のアドレス0099FDD8

配列変数a[5]のアドレス0099FDDC


 👈で示すように


            0099FDCC 



となります



ポインタ変数


        a+1


の格納しているアドレスは


ポインタ変数aがアドレス0099FDC8を格納しているので     


アドレス0099FDC8にそのまま1を足した


アドレス0099FDC9


とはならないんです」


solarplexuss「わあおぅ


そういう仕組みになっているんだ」



アレサ「😊


つまり


char型、int型の配列変数であるかにかかわらず


 配列変数a[0]のアドレスを格納しているポインタ変数aに1を足すポインタ演算


             a+1


が実行されると



             a+1




配列変数a[0]の🍓の配列変数a[1]のアドレスを格納するポインタ変数となるのですの😊」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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