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がアドレスに加えられるという情報は


メモリに格納されていないんだよ」








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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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