C言語におけるvoidとvoid*の定義と使い方

1262 ワード

void
voidの最も一般的な使い方は、関数のパラメータと戻り値を定義するvoid draw(void)である.関数drawにパラメータも戻り値もないことを示し、voidの他の場所での応用も見たことがありません.
実際、voidとint、char、doubleなどのタイプを一緒に理解すると、まずその本質を明らかにすると、変数タイプは固定サイズのメモリブロックの別名であり、voidがどれだけのメモリを占有するか、コンパイラはvoidがどれだけのメモリを占有するかを定義していないので、void varに対して;このような定義では、コンパイラは当然許されず、vsでのエラープロンプトは、不完全なタイプの使用は許されない.
void*
void*はvoidよりも意味があります.void*はポインタタイプで、ポインタ変数はすべて4 byteメモリ(4 byte=32 bit=2^32=4 Gなので、4 byteは任意のメモリアドレスを指すのに十分です)を占めているので、void*p=NULLに対して;このような定義は、コンパイラがpにメモリを割り当てることができるが、このような定義のpはどのような役割を果たすのだろうか.
int *a=NULL;
p=a;
double *b=NULL;
p=b;
char c[16]={0};
p=c;
void*は白い紙のように、どのタイプのポインタもvoid*タイプのポインタに直接割り当てることができます.
でも逆に
int *a=NULL;
a=p;//err
a=(int *)p;//強制型変換が必要
このように回って何の意味がありますか?
典型的な応用
1
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

memcpyとmemsetは、メモリ操作関数でありbitを操作するため、データ型を考慮すると何の意味もありません(本質に触れるほど抽象的であり、包容性もあります).

int *a=NULL;
a=(int *)malloc(sizeof(int));
同じように、malloc関数はあなたがどれだけのメモリを必要としているかだけに注目しています.それをどのように区分するかはあなたのことですが、どのように区分しているかを明示的に示す必要があります.ここで文法的要件は必須であり、void*タイプを他のタイプに変換するには強制的なタイプ変換が必要です.