C言語のvoidポインタとは?宣言方法から使い方まで徹底解説
voidポインタ(汎用ポインタ)とは、あらゆるデータ型の変数のアドレスを格納できる、あるいは任意のデータ型の変数を指すことができる特殊なポインタです。通常のポインタは指し示すデータ型が固定されていますが、voidポインタはint型でもfloat型でもchar型でも、どんな型の変数でも指せる柔軟性を持っています。
voidポインタの宣言
voidポインタの宣言は以下のように行います。
void *pointername;
記述例:
void *vp;
値へのアクセス方法
voidポインタが指す変数の値にアクセスするには、型キャスト演算子を使用する必要があります。voidポインタ自体にはデータ型の情報がないため、参照先の実際の型にキャストしてから間接参照(デリファレンス)します。
構文
*( (型キャスト) voidポインタ )
基本的な使用例
次のコードは、voidポインタを使ってint型変数の値を取得する例です。
int i = 10;
void *vp;
vp = &i;
printf("%d", *( (int*) vp ));
// int* 型へのキャストが必要サンプルプログラム1:異なる型への対応
以下は、同じvoidポインタでint型とfloat型の両方を扱うCプログラムの例です。
#include<stdio.h>
main( ){
int i = 10;
float f = 5.34;
void *vp;
vp = &i;
printf("i = %d", *( (int*) vp));
vp = &f;
printf("f = %f", *( (float*) vp));
}実行結果
上記のプログラムを実行すると、以下の出力が得られます。
i = 10 f = 5.34
このように、同一のvoidポインタ「vp」に対して、アクセス時に適切な型へキャストすることで、int型・float型など異なるデータ型の変数を柔軟に扱えることがわかります。
サンプルプログラム2:voidポインタでのポインタ演算
続いて、voidポインタに対してポインタ演算(加算)を行い、配列の各要素にアクセスするCプログラムの例を紹介します。
#include<stdio.h>
#define MAX 20
int main(){
int array[5] = {12, 19, 25, 34, 46}, i;
void *vp = array;
for(i = 0; i < 5; i++){
printf("array[%d] = %d\n", i, *( (int *)vp + i ) );
}
return 0;
}実行結果
上記のプログラムを実行すると、以下の出力が得られます。
array[0] = 12 array[1] = 19 array[2] = 25 array[3] = 34 array[4] = 46
ここでは (int *)vp + i のように、まずint型ポインタへキャストしてから加算しています。キャストを行わずにvoidポインタへ直接加算した場合、動作は処理系依存となるため注意が必要です。
まとめ
- voidポインタは任意のデータ型の変数アドレスを保持できる汎用的なポインタである。
- 宣言は
void *vp;の形式で行う。 - 値を参照する際は、必ず元のデータ型へ型キャストしてから間接参照する。
- malloc関数の戻り値や汎用的な関数の引数など、さまざまな場面で活用される。
-
C/C++におけるvoidポインタのサイズとは?環境別のサイズと確認方法を解説
C/C++におけるvoidポインタのサイズは、実行環境(システムのアーキテクチャ)によって異なります。ポインタのサイズは、その環境で扱えるメモリ空間の大きさに依存するためです。各環境におけるvoidポインタのサイズは以下の通りです。16ビットシステム: 2バイト32ビットシステム: 4バイト64ビットシステム: 8バイトこのように、ポインタのサイズは環境のビット幅と一致するのが一般的です。これは、ポインタがメモリアドレスを格納するため、アドレス空間を表現できるだけのサイズが必要だからです。voidポインタのサイズを確認するサンプルコード以下は、C言語でsizeof演算子を使ってvoidポインタ
-
C#プログラミングとは?初心者にもわかる特徴と基本を徹底解説
C#(シーシャープ)とは何かC#は、Microsoft(マイクロソフト)が開発したモダンで汎用性の高いオブジェクト指向プログラミング言語です。Windowsアプリケーションの開発をはじめ、Webサービス、ゲーム開発(Unity)、業務システムなど、幅広い分野で活用されています。C#は「共通言語基盤(CLI:Common Language Infrastructure)」向けに設計されています。CLIは実行可能なコードとランタイム環境から構成されており、これにより異なるコンピュータプラットフォームやアーキテクチャ上で、さまざまな高水準言語を利用できるようになっています。C#の主な特徴C#には、開