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

C言語のvoidポインタとは?特徴・制限・使い方をサンプルコード付きで解説

voidポインタ(void pointer)とは、C言語において特定のデータ型に紐づいていないポインタのことです。メモリ上のデータ位置、すなわち変数のアドレスを指すことができ、汎用ポインタ(general purpose pointer)とも呼ばれます。

C言語では、動的メモリ確保に使われる malloc()calloc() 関数が、戻り値として void * 型(ジェネリックポインタ)を返すことでも知られています。

voidポインタの制限

voidポインタは柔軟に使える反面、以下のような制限があります。

1) ポインタ演算ができない
voidポインタは指し示すデータのサイズが確定していないため、インクリメントや加算などのポインタ演算を行うことができません。

2) そのまま参照解除(デリファレンス)できない
voidポインタを直接参照解除することはできません。値にアクセスするには、(int*)(float*) のように適切な型へキャストする必要があります。

処理の流れ(アルゴリズム)

Begin
    整数型の変数 a を宣言する
        a = 7 で初期化する
    float型の変数 b を宣言する
        b = 7.6 で初期化する
    void型のポインタ p を宣言する
    ポインタ p に a のアドレスを代入する
    「Integer variable is」を出力する
        ポインタ p を使って a の値を出力する
    ポインタ p に b のアドレスを代入する
    「Float variable is」を出力する
        ポインタ p を使って b の値を出力する
End.

以下に、voidポインタの基本的な使い方を示すシンプルなサンプルコードを紹介します。

サンプルコード

#include<stdlib.h>
int main() {
    int a = 7;
    float b = 7.6;
    void *p;
    p = &a;
    printf("Integer variable is = %d", *( (int*) p) );
    p = &b;
    printf("\nFloat variable is = %f", *( (float*) p) );
    return 0;
}

実行結果

Integer variable is = 7
Float variable is = 7.600000

このように、同じvoidポインタ p を使って、int型の変数にもfloat型の変数にも対応できることが分かります。ポイントは、値を取り出す際に (int*)(float*) と明示的にキャストしている点です。voidポインタを活用することで、さまざまなデータ型を扱う汎用的な関数やデータ構造を実装できます。

  1. C#のActionデリゲートとは?宣言方法と使い方を実例付きで解説

    Actionデリゲートの基本C#におけるActionデリゲートは、戻り値を持たないメソッド(void型のメソッド)を参照するために使用される組み込みデリゲートです。Funcデリゲートと異なり、値を返さない処理に特化しているため、コンソールへの出力やログ記録など、単に処理を実行するだけのメソッドを扱う際に便利です。また、Actionデリゲートは最大16個までの引数を受け取ることができます。例えば Action<int> はint型の引数を1つ受け取るメソッドを表します。Actionデリゲートの宣言方法Actionデリゲートは以下のように宣言します。Action<int>

  2. C#でポインタを使ってデータ値を取得する方法

    ポインタとは、別の変数のアドレス(メモリ上の場所)を値として格納する特殊な変数のことです。ポインタ変数が参照しているアドレスに格納されたデータを取得するには、ToString()メソッドを使用します。 コード例 以下に、ポインタからデータ値を取得する具体的なサンプルコードを示します。 ToString()); Console.WriteLine(Address is: {0} , (int)p); } Console.ReadKey(); } } } 出力結果 このコードを実行するには、