C言語のvoidの使い方について

C言語のvoidの使い方について調べたので、まとめておく。

関数定義におけるvoidについて

関数定義におけるvoidは、単純に「戻り値がない関数」を作る時に使うもの。

void createFunction() {
  処理
}

voidはmain関数に対して使うことができる。

ポインタとしてのvoid*

問題は、voidがvoid*のようにポインタとして扱われている場合だ。このvoid*は他のポインタ型のchar*int*等とは一味違い、単純にアドレスを返すだけの型と言える。

実はchar*int*等のポイント型は単純にアドレスを示しているのではなく、次のアドレスが何番目になるのかと言う情報を含まれているのだ。

これだけだと分かりにくいので、具体的な例を挙げる。 以下の例では、int*型のポインタを作成しているコードである。

void main() {
  int i = 10;
  int* p;
  p = &i;
}

上記のコードでは、変数iに整数10を入れて、そのiのポインタとしてpを書いている。 そして、以下のコードを追加したとしよう。

p = p + 1;   /* p++ と書いても良い */

上記の処理ではポインタpに+1をしている。仮にポインタpのアドレス番号を100とすると、p = p + 1の計算でpに入る数字は101ではなく104となる

なぜなら、ポインタpが指しているアドレスには変数int i = 10が格納されているが、intは4byte使う型であるからだ。(ポインタは変数などの最初のアドレスを取得している)

以上がvoid*と他のポインタ型との違いだし、逆に言うとvoidポインタは極力使うのは避けるべきとも言える。

また、void*については以下の記事達が詳しい。

参考記事:c - What does void* mean and how to use it? - Stack Overflow

参考記事:voidへのポインタ

参考記事:malloc

参考記事:基本的な演算子