void,NULLと0の違いのつながり

2127 ワード

void,NULLおよび0の区別連絡
voidの詳細:
voidの字面は「タイプなし」または「空のタイプ」を意味し、void*は「針なしポインタ」であり、void*が任意のタイプのデータを指すことができることを意味する.
周知のように、ポインタp 1とp 2のタイプが同じであれば、p 1とp 2の間で直接値を割り当てることができ、問題は発生しない.しかし、p 1とp 2が異なるデータクラスを指す場合
タイプの場合は、強制タイプ変換を使用する必要があります.
演算子は、付与記号の両側のタイプを同じタイプまたは互換性のあるタイプに変換します.すなわち、付与演算子の右側のポインタタイプを左のポインタのタイプに変換します.
例:
float *p1;
int *p2;
p1 = p2;

ここでp 1=p 2文はコンパイルされて警告が表示されます
In function ‘main’:
15:7: warning:assignment from incompatible pointer type [enabled by default]
15行目の付与タイプが互換性がないことを示します
p 1=(float*)p 2に変更します.やっと正しい;
void*は、強制的なタイプ変換を行うことなく、任意のタイプのポインタを直接割り当てることができます.
void*p1;
int *p2;
p1 = p2;
ですが、これは意味しません.
void*
タイプ変換を強制することなく、他のタイプのポインタに割り当てることもできます.[タイプなし](No Type)は[タイプ](Type)を収容し、[タイプ](Type)は[タイプなし](No Type)を収容できないためです.道理は簡単だ
単に、「男も女も人」と言ってもいいが、「人は男」や「人は女」とは言えない.
次の文のコンパイルエラーまたは警告:
void *p1;
int *p2;
p2 = p1;

C言語では,戻り値タイプに限定されない関数は,コンパイラによって戻り整数値として扱われる.しかし、多くの人はvoidタイプだと勘違いしている.例:
add ( int a, int b )
{
return a + b;
}
int main(int argc,char* argv[])
{
printf ( "2 + 3= %d", add ( 2, 3) );
}

プログラムの実行結果は出力です.
2 + 3 = 5
これは、戻り値の説明を加えない関数がint関数であることを示しています.
NULL詳細:
実行:
#include<stdo.h>
int main()
{
int *p=NULL;
printf("%s",p);
}

出力:(null)
gdbデバッグではint*p=NULLが実行され、pの値は0 x 00000000であることがわかり、NULLは実際の最下位呼び出しで0であることがわかります.
NULLはC言語のstdio.hヘッダファイルの定義は:
#if!defined(NULL) && defined(__NEEDS_NULL)
#ifdef__cplusplus
#defineNULL 0
#else
#defineNULL ((void *)0)
#endif
#endif

このことから,C言語ではNULLと0の値は同じといえるが,目的や用途や識別が容易な理由から,NULLはポインタやオブジェクトに用いられ,0は
数値
文字列の末尾には'0'を使用します.値も0ですが、文字列の末尾であり、ポインタではなく、普通の数値ではないことがわかります.違うシステムで
では、NULLは常に0などではありません
同様に、NULLは空の値のみを表し、すなわち使用されないアドレスを指し、多くのシステムでは0を使用されないアドレスとしているため、このような
定義#テイギ#
#defineNULL 0

しかし、必ずしもそうではなく、0アドレスをNULLではなく、他のアドレスを使用するシステムもあります.