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

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

ReratedPosts

WindowsのMinGWでdxlib(DXライブラリ)を使う手順を紹介する
Linuxのopen(低水準入出力)の使い方やfopenとの違いをまとめていく
C言語のコンパイルにおけるアセンブラ→実行ファイルまでの流れをまとめてみた
segmentation fault 11(core dumped)の原因と2つのチェックポイント
C言語からRubyやPHPなどのスクリプト言語を呼び出して、実行結果をC言語に渡す方法
C言語の安全な文字列コピーは、strcpyよりもstrncpy、そしてstrlcpyが良い