🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
アドレス演算とはアドレスを格納しているポインタ変数に数値を普通の数値計算のように数値を足したり引いたりすることです その式は配列変数のアドレスを格納するポインタ変数となります
アドレス演算とはアドレスを格納しているポインタ変数に数値を普通の数値計算のように数値を足したり引いたりすることです その式は配列変数のアドレスを格納するポインタ変数となります
アレサ「ソーラーさん
ポインタ変数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]の
のアドレスを格納しているポインタ変数となります
つまり
ポインタ変数
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]の
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます