C++ ⇒ VBA 書いて覚えるための初心者自己中記事

C++ ⇒ VBA 勉強の履歴を付けるというかノート代わりに使ってます

C++ voidへポインタ 書いて覚えるための初心者自己中記事

void 型(?)のポインタにいろいろな型のアドレスを代入してみる。

 

int main() {
	char c = '1';
	int i = 2;
	double d = 3;
	void* p;
 
	p = &c;//ここでエラーにはなってない
	cout << *p << ' ';//ここでエラー
 
	p = &i;
	cout << *p << ' ';
 
	p = &d;
	cout << *p << endl; 
 
system("pause");

アドレスの代入ではエラーになっていない。

それぞれの代入した型のアドレスにある値を呼び出そうとしたときにエラーになる。

 

現状、型の種類に関係なくキャストなしでvoid ポインタに代入出来ている。

型チェック的なのをしていないということなのだろうか。

 

呼び出す時には本来の型でキャストしてあげると良い。

p = &c;
cout << *static_cast<char*>(p) << ' ';//本来の型にキャストする
 
p = &i;
cout << *static_cast<int*>(p) << ' ';//*のつけ方が・・・
 
p = &d;
cout << *static_cast<double*>(p) << endl; //あ、わかるわ。

この void ポインタをほかのポインタに代入するときもキャストすればいいらしい。

p = &i;
cout << *static_cast<int*>(p) << ' ';
 
int* pi = static_cast<int*>(p);//これね
cout << *pi << endl;

 

void ポインタが活躍するのは仮引数にするときで、

実引数がどんな型でも受け取ることが出来るので

void ポインタを仮引数にした関数で

引数を16進ダンプするとかだと大活躍。

 

忘れたときのために書いておくと16進ダンプとは

メモリやファイルの中身を16進数で表示させること

 

void Dump(const void* vp, size_t size) {
	static const int WIDTH = 16;
 
	const char* p = static_cast<const char*>(vp);
 
	for (size_t i = 0; i < size; ++i) {
		if (i % size == 0 && i != 0) {
			cout << endl;
		}
		printf("%02X ", p[i]);
	}
	cout << endl;
}
 
 
int main() {
	int n = 0x12345678;
	const char str[] = "hello";
 
	Dump(&n, sizeof n);
	Dump(str, sizeof str);
 
system("pause");
}

 

実体一つで完結するので大好き。

 

ここまで。