voidへのポインタ (C++をもう一度)
[履歴] [最終更新] (2016/06/03 22:01:59)

サンプルコード

void へのポインタ void* には関数ポインタおよびメンバポインタを除く (← コンパイラによっては代入できてしまいますが独自仕様です) ポインタをキャストなしで代入できます。ただし void* のままでは、実体にアクセスすることも他のポインタに代入することもできません。事前に何らかの型のポインタ型にキャストする必要があります。

一般に void* は型情報が完全に失われても問題ない場合に使用します。確かにキャストし直せばもとの型の値にアクセスできますが、そのような必要性のある場面には void* ではなく関数テンプレートの使用を検討したほうがよいです。void* をキャストするのは以下の HexDump のような場合です。

#include <iostream>
#include <cstdio>
using namespace std;

void HexDump(const void* vp, size_t size) {
    static const int WIDTH = 16; // 静的定数 https://www.qoosky.io/techs/fc41205299
    const char* p = static_cast<const char*>(vp); // charは1バイト https://www.qoosky.io/techs/dcff1dfcc3
    for(size_t i = 0; i < size; ++i) { // int と size_t の比較は環境によっては警告されるため i も size_t 型に。
        if(i % WIDTH == 0 && i != 0) { // ショートサーキット (EXPR && EXPR や EXPR || EXPR)
            cout << endl;
        }
        printf("%02X ", p[i]);
    }
    cout << endl;
}

int main() {
    int n = 0x12345678;
    char str[] = "ABCD";
    HexDump(&n, sizeof n); //=> 78 56 34 12 (リトルエンディアン https://www.qoosky.io/techs/736a22850b)
    HexDump(str, sizeof str); //=> 41 42 43 44 00

    char ch = 'a';
    void* p = &ch;

    // char* cp = p; // エラーです
    char* cp = static_cast<char*>(p); // とします

    // cout << *p << endl; // エラーです
    cout << *static_cast<char*>(p) << endl; // とします
    cout << *(char*)p << endl; // static_cast を使用しない場合

    return 0;
}
関連ページ