void*型の変数のポインタ演算を行うことはできません
ソーラー「
int a = 1;
void* d=&a;
を実行して
void*型の形式でメモリに格納されたデータ
と
int a = 1;
int* d=&a;
を実行して
int*型の形式でメモリに格納されたデータ
は
同じ
int型の変数aの管理する4バイトのメモリの先頭の1バイトのメモリのアドレス
なのだけど
取り扱われ方が違うということを表しているんだ
void*型の形式でメモリに格納されたデータ
は
単に
💖int型の変数aの管理する4バイトのメモリの先頭の1バイトのメモリのアドレス
だけの情報を持っている💖のに対し
int*型の形式でメモリに格納されたデータ
は
単に
💖int型の変数aの管理する4バイトのメモリの先頭の1バイトのメモリのアドレス
だけの情報を持っている💖のではなく
💖int型の変数aの管理する4バイトのメモリにアクセスするための情報も持っているんだ💖
これが
void*型の形式でメモリに格納されたデータ
と
int*型の形式でメモリに格納されたデータの違いだね
#include <stdio.h>
int main() {
int a = 1;
void* d;
d = &a;
printf("%d\n", *d);//🌞void*型のポインタ変数dにint型の変数aのアドレスを格納しています
return 0;
}
同じアドレスデータがメモリに格納されていても
型によって
そのアドレスデータは取り扱われ方が違うということを表しているんだ
void*型のポインタ変数dにたとえ
int型の変数aのアドレスを代入したとしても
*dは
int型に対応する4バイトのメモリ全体にはアクセスできないんだね
そのことを示すプログラムはこちらです
👇
#include <stdio.h>
int main() {
int a = 1;
void* d;
d = &a;
printf("%d\n", *d);
return 0;
}
プログラムの実行結果
エラー C2100 間接指定演算子 (*) の使い方が正しくありません。
エラー (アクティブ) E0852 式は完全なオブジェクト型へのポインターである必要があります
アレサ「void*型のポインタ変数dには
様々なタイプの型の変数のアドレスが代入できても
dにアスタリスクをくっつけた
*d
は
機能しないのですね」
ソーラー「みんな
void*型の形式でメモリに格納されたデータ
は
単に
💖int型の変数aの管理する4バイトのメモリの先頭の1バイトのメモリのアドレス
だけの情報を持っている💖のに対し
int*型の形式でメモリに格納されたデータ
は
単に
💖int型の変数aの管理する4バイトのメモリの先頭の1バイトのメモリのアドレス
だけの情報を持っている💖のではなく
💖int型の変数aの管理する4バイトのメモリにアクセスするための情報も持っているんだ💖
ということがわかったかな?
僕もわかっちゃったぞ
void*型の形式でメモリに格納されたデータ
は
💖int型の変数aの管理する4バイトのメモリにアクセスするための情報は持っていないんだね💖
💖int型の変数aの管理する4バイトのメモリにアクセスするための情報は持っていないんだね💖
さらに
void*型の変数dにint型の変数aのアドレスを
代入して
ポインタ演算
d+1
d+2
・
・
・
等を
行うことはできません
おさらいしちゃおっかな
ポインタ演算とは
ポインタ変数に数値データを足し合わせることでした
int*型のポインタ変数dにint型の変数aのアドレスを
代入した場合
d+1
は
int*型のポインタ変数dに格納されたアドレス+4
のアドレスを表すことになります
d+1では
int*型のポインタ変数dに格納されたアドレスに+1
が行われるのでなく
int*型のポインタ変数dに格納されたアドレスに
intに相当する4が
くわえられることになります
そのプログラムはこちらです
👇
#include <stdio.h>
int main() {
int a = 1;
int* d;
d = &a;//🌞void*型のポインタ変数dにint型の変数aのアドレスを格納しています
printf("%p\n", d);
printf("%p\n", d+1);
printf("%p\n", d+2);
printf("%p\n", d+3);
return 0;
}
プログラムの実行結果
0062FC00
0062FC04
0062FC08
0062FC0C
C:\Users\solar\source\repos\Project6\Debug\Project6.exe (プロセス 31652) は、コード 0 で終了しました。
このウィンドウを閉じるには、任意のキーを押してください...
ソーラー「
dは0062FC00
d+1は0062FC04
d+2は0062FC08
d+2は0062FC0C
をあらわしているのがわかるね
4ずつ
アドレスの値が増えているね
はは
dは0062FC00
d+1は0062FC01
d+2は0062FC02
d+2は0062FC03
をあらわすことにはならないね
では次に
void*型の形式でメモリに
void*型のポインタ変数dに
int型の変数aのアドレスを
代入して
コマンドプロンプト画面に
int型の変数aのアドレスを表示してみたいと思います
#include <stdio.h>
int main() {
int a = 1;
void* d;
d = &a;//🌞void*型のポインタ変数dにint型の変数aのアドレスを格納しています
printf("%p\n", d);
return 0;
}
プログラムの実行結果
0024FB94
C:\Users\solar\source\repos\Project6\Debug\Project6.exe (プロセス 15936) は、コード 0 で終了しました。
このウィンドウを閉じるには、任意のキーを押してください...
ソーラー「ちゃんとvoid*型のポインタ変数dに格納されているint型の変数aのアドレス
が表示されています
今度は
void*型のポインタ変数dに1を足す
ポインタ演算
d+1
を実行してみるね
#include <stdio.h>
int main() {
int a = 1;
void* d;
d = &a;//🌞void*型のポインタ変数dにint型の変数aのアドレスを格納しています
printf("%p\n", d+1);
return 0;
}
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー (アクティブ) E0852 式は完全なオブジェクト型へのポインターである必要があります
エラー C2036 'void *': サイズが不明です。
アレサ「ポインタ演算
d+1
を
実行することができていないのですの」
ソーラー「
エラー C2036 'void *': サイズが不明です。
に注目だね
実は
int*型のポインタ変数dに
int型の変数のアドレスが格納された場合
int*型の形式でアドレスデータがメモリに格納されることになるのですが
そのとき
ポインタ演算d+1をおこなったとき
int*型のポインタ変数dに格納されたアドレス+4
を行うという情報もメモリに格納されているんだ」
アレサ「そうなのですか
int型の形式ではメモリに数値データが格納されるだけなのですが
int*型の形式では
ポインタ演算d+1をおこなったとき
int(4バイト)に相当する4がアドレスに加えられるという情報までもが
メモリに格納されているのですね」
ソーラー「そう
void*型の形式では
アドレスデータだけがメモリに格納されても
ポインタ演算d+1をおこなったとき
int(4バイト)に相当する4がアドレスに加えられるという情報は
メモリに格納されていないんだよ」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます