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