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

アレサ「ソーラーさん


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


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


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

👇


#include <iostream>


using namespace std;


int main() {


char* a="cat";


cout << a[0] << "\n";

cout << a[1] << "\n";

cout << a[2] << "\n";

cout << a[3] << "\n";


cout << &a[0] << "\n";

cout << &a[1] << "\n";

cout << &a[2] << "\n";

cout << &a[3] << "\n";


cout << a << "\n";



return 0;


}




ビルド実行結果


c

a

t

(空白)

cat


アレサ「はい


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]🌞



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



この           🌞次🌞


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



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

👇

#include <iostream>


using namespace std;



int main() {


int a[6]={ 1,2,3,4,5,6 };


cout << a[0] << "\n";

cout << a[1]<< "\n";

cout << a[2]<< "\n";

cout << a[3] << "\n";

cout << a[4] << "\n";

cout << a[5] << "\n";


cout << a << "\n";

cout << a + 1 << "\n";

cout << a + 2 << "\n";

cout << a + 3 << "\n";

cout << a + 4 << "\n";

cout << a + 5 << "\n";


return 0;


}

ビルド実行結果


1

2

3

4

5

6

0073FBD8

0073FBDC

0073FBE0

0073FBE4

0073FBE8

0073FBEC


👆

このプログラムのように


int型の配列宣言、初期化


int a[6]={ 1,2,3,4,5,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]のアドレス0073FBD8 👈ポインタ変数aの格納しているアドレス

配列変数a[1]のアドレス0073FBDC👈ポインタ変数a+1の格納しているアドレス

配列変数a[2]のアドレス0073FBE0 👈ポインタ変数a+2の格納しているアドレス

配列変数a[3]のアドレス0073FBE4 👈ポインタ変数a+3の格納しているアドレス

配列変数a[4]のアドレス0073FBE8 👈ポインタ変数a+4の格納しているアドレス

配列変数a[5]のアドレス0073FBEC 👈ポインタ変数a+5の格納しているアドレス


 👈で示すように


            0073FBDC



となります



ポインタ変数


        a+1


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


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


アドレス0073FBD8にそのまま1を足した


アドレス0099FDC9


とはならないんです


solarplexuss「わあおぅ


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



てんC「(*´▽`*)


つまり


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


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


             a+1


が実行されると



             a+1




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









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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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