voidとvoid*

1347 ワード

voidポインタは何ですか?
voidポインタは一般的に汎用ポインタまたは汎ポインタと呼ばれ、Cの「純粋なアドレス(raw address)」に関する約束である.voidポインタはオブジェクトを指しますが、オブジェクトはタイプに属しません.次の例を見てください:int*ip;void *p; 前の例では、ipは整数値を指し、pが指すオブジェクトは任意のタイプに属しません.Cでは、voidポインタの代わりに他のタイプのポインタを使用するか(C++でも同様)、他のタイプのポインタの代わりにvoidポインタを使用するか(C++で強制変換が必要)、強制変換は必要ありません.たとえば、char*タイプのポインタをvoidポインタを必要とする関数に渡すことができます.
voidポインタはいつ使いますか?
純粋なメモリ操作を行う場合や、未定のタイプを指すポインタを渡す場合にvoidポインタを使用します.voidポインタは関数ポインタとしてもよく用いられる.
一部のCコードでは、純粋なメモリ操作のみが行われます.以前のバージョンのCでは、これは文字ポインタ(char*)によって実現されたが、文字ポインタが文字列を指しているのか、文字配列を指しているのか、メモリ内のアドレスを指しているのかを判断しにくいため、混同されやすい.
たとえば、strcpy()関数は1つの文字列を別の文字列にコピーし、strncpy()関数は1つの文字列の一部を別の文字列にコピーします:char*strepy(char'strl、const char*str 2);char *strncpy(char *strl,const char *str2,size_t n); memcpy()関数は、メモリ内のデータをある場所から別の場所にコピーします.void*memcpy(void*addrl,void*addr 2,size_t n);memcpy()関数はvoidポインタを使用しており、NULL文字(ゼロバイト)を含む任意のコンテンツがコピーされる純粋なメモリコピーのみが行われることを示しています.次の例を参照してください.
#include "thingie.h"    /* defines struct thingie */
struct thingie *p_src,*p_dest;
/*  ...  */
memcpy(p_dest,p_src,sizeof(struct thingie) * numThingies);

前の例ではmemcpy()関数はstructthingie構造体に格納されているオブジェクトop_をコピーします.destとp_srcはstructthingie構造体を指すポインタで、memcpy()関数はp_からsrcが指す位置から始まるsizeof*numThingiesバイトのコンテンツをp_destが指す位置から始まるメモリ領域.memcpy()関数にとって、p_destとp_srcは、メモリ内のアドレスを指すポインタにすぎません.