Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【初心者向け】CとC++における「void*」の違いを徹底解説

はじめに

voidポインタ(void*)は、任意の型のデータのアドレスを格納できる汎用的なポインタです。しかし、一見同じように見えるvoidポインタにも、CとC++では扱い方に重要な違いがあります。本記事では、その違いを具体例を交えてわかりやすく解説します。

CとC++の最大の違い:代入時の型変換ルール

両言語ともvoidポインタという概念自体は共通していますが、以下の点が大きく異なります。

  • Cの場合:voidポインタを他の任意のポインタ型に暗黙的に変換して代入できる。
  • C++の場合:暗黙的な変換は許されず、明示的なキャストが必須。

Cでの動作例

まず、次のコードを見てください。これはCで記述した場合、何の問題もなく実行できます。

void *p;
int *int_ptr = p;

Cでは、voidポインタが自動的にint型ポインタへ変換されるため、このままコンパイルが通ります。

malloc()との組み合わせ

malloc()関数を使ってメモリを確保する場合も同様です。malloc()は戻り値としてvoidポインタを返しますが、Cでは明示的なキャストをしなくても問題なく動作します。

int *int_ptr = malloc(sizeof(int) * 10);

このコードでは、malloc()が返したvoidポインタが、暗黙的にint型ポインタへ変換されています。もちろんCでも明示的にキャストすることは可能で、チームのコーディング規約によってはキャストを推奨する場合もあります。

CとC++の両方で動作させるコード

同じソースコードをCとC++のどちらでもコンパイルできるようにしたい場合は、voidポインタに対して必ず明示的なキャストを記述しましょう。

void *p;
int *int_ptr = (int *) p;
int *arr_ptr = (int *) malloc(sizeof(int) * 10);

このように書けば、CでもC++でも意図した通りに動作します。

C++ならstatic_castがおすすめ

なお、純粋なC++のコードを書く場合は、C形式のキャストではなくstatic_cast<int*>(p)のようなC++スタイルのキャストを使うのが一般的です。キャストの意図が明確になり、誤った変換をコンパイラが検出しやすくなるためです。

まとめ

両者の違いを表に整理すると次のようになります。

項目CC++
void* → 他のポインタ型への暗黙的変換可能不可
明示的なキャスト不要(付けた方が安全な場面もある)必須
推奨されるキャスト方法(int *) 形式static_cast<int*> 形式

CとC++の互換性を保ちたいコードでは、常に明示的なキャストを書く習慣をつけておくと安心です。

  1. C++で組み合わせと順列を計算する方法をわかりやすく解説

    組み合わせと順列とは組み合わせ(Combination)と順列(Permutation)は、数学の一分野である組合せ論(Combinatorics)に属する概念です。順列とは、n個の要素の中から、1つずつ・いくつかずつ・あるいはすべてを一度に取り出して並べるときの、異なる並び方の総数のことです。並べる順序が結果に影響する点が特徴です。一方、組み合わせとは、同じくn個の要素から1つずつ・いくつかずつ・すべてを取り出して選ぶときの、異なる選び方の総数です。順序は考慮されないため、順列よりも数が少なくなります。計算式順列の数n個の要素全体からr個の要素を並べるときの順列の数は、次の公式で求められます

  2. Void Linuxとは?特徴とインストール方法を完全ガイド

    Void Linuxは、強力でありながら取り組みやすいオペレーティングシステムを目指すLinuxディストリビューションです。シンプルさと安定性を両立するため、initシステムに「runit」、そして独自の軽量パッケージマネージャーを採用しています。 Arch Linuxと同様に、Void Linuxは「ローリングリリース」モデルと「ユーザー中心」の設計思想を採用しています。つまり、常に最新の状態へ更新され続ける一方、インストール直後の状態は必要最小限の構成になっています。この特性により、自分が理解し、自由にカスタマイズできる柔軟なOSを求める上級ユーザーにとって魅力的な選択肢となっていま