Void ポインターについて: C と C の違い
Void ポインターは C と C の両方の重要な側面ですが、顕著な違いがあります彼らの扱いにおいて。この記事では、これらの違いを調査し、一見矛盾した動作が発生する理由を説明します。
C の暗黙的な変換
C では、特定の型へのポインター間の変換 (例: int) と void ポインター (void) は常に暗黙的です。これは、次のステートメントが有効であることを意味します:
int* p = malloc(sizeof(int));
malloc 関数は void* を返し、これがint* ポインタ。ただし、 C では、このような暗黙的な変換は許可されません。
C での明示的なキャスト
C では、ポインターから void ポインターへの変換は依然として暗黙的ですが、 void ポインターから特定の型に変換するには、明示的なキャストが必要です。これは、次のコードが C と C の両方でコンパイルされる理由を説明しています:
void foo(void* vptr)
{
}
int main()
{
int* p = (int*) malloc(sizeof(int));
foo(p);
return 0;
}
malloc 関数は void* を返し、それが foo 関数に渡されます。 int* ポインターが void* パラメーターに割り当てられている場合でも、C ではこの暗黙的な変換が許可されています。ただし、その後の p の呼び出しには、int* 型への明示的なキャストが必要です。
標準の観点
K&R2 仕様によれば、オブジェクトへのポインタはすべて、情報を失うことなく安全に void* に変換できます。さらに、元のポインタ型に変換し直すと、元の値が復元されます。 C では、標準により、任意のポインター型から void* への暗黙的な変換が許可されることが指定されていますが、 void* から他の型への変換には明示的なキャストが必要です。
結論
C と C の void ポインター処理の主な違いは、 C で void* から特定の型に変換する際の明示的なキャストの要件にあります。このより厳密なアプローチは、未定義の動作を防止し、C コードの型の安全性を維持するのに役立ちます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3