ホームページ  >  記事  >  php教程  >  C/C++ の void と void*

C/C++ の void と void*

高洛峰
高洛峰オリジナル
2016-12-13 13:17:301218ブラウズ

1. void

void キーワードは「空の型」の概念を表します。ただし、ここでの「空の型」は「任意の型」という意味ではなく、その型が存在しないことを意味します。つまり、C/C++ では void a という文を書くことはできず、型というものは存在しません。 void

void は " 「存在しない」という意味は、void の 2 つの用途から反映されます:
1. void が関数の戻り値の型として使用される場合、関数の戻り値は存在しないことを意味します。存在する、つまり関数には戻り値がありません。
例:
void FunctionNoReturn_0(std::string strName)
{
std::cout << strName << std::endl;
return;
}
void FunctionNoReturn_1(std::string strName)
{
std::cout << strName << std::endl;
}
FunctionNoReturn_1 関数本体に明示的な Return ステートメントはありません。ただし、関数に戻り値がないことを示す暗黙的な Return があります。
FunctionNoReturnType(void)
{
return 10;
}
C 言語では、戻り値の型が指定されていない関数は、コンパイラによって戻り値なしではなく整数値を返すものとして扱われます。したがって、FunctionNoReturnType 関数が 10 を返すのは正しいことです。
C++ では、各関数は戻り値の型を制限する必要があり、戻り値の制限は許可されません。したがって、C++ コンパイラは FunctionNoReturnType にエラーを報告します。
2. void が関数のパラメータ制限として使用される場合、それは関数パラメータが存在しないこと、つまり関数に仮パラメータがないことを意味します。
例:
void FunctionNoArgument_0(void)
{
return;
}
void FunctionNoArgument_1()
{
return;
}
注: void FunctionNoArgument_1(); これは、仮パラメータがないことも意味します。
C 言語では FunctionNoArgument_1(10); が有効です。コンパイラはエラーを報告しません。
C言語ではFunctionNoArgument_0(10);は不正です。コンパイラはエラーを報告します。
C++ 言語では、FunctionNoArgument_1(10); と FunctionNoArgument_0(10);
は両方とも不正です。コンパイラはエラーを報告します。
C言語はエラーがなければ問題ありません。パラメーター 10 は関数の実行結果に影響を与えないためです。ただし、コードを維持すると、隠れた害が生じたり、他の人に誤解を与えたりする可能性があります。

手順: void の次の 2 つの用途が提供されているので、それらを使用してください。つまり、関数が値を返さない場合、その戻り値の型は void として書き込まれ、関数に仮パラメータがない場合、その仮パラメータは void として書き込まれます。コンパイラのデフォルトの動作を理解していない場合は、これに依存しないでください。たとえデフォルトの動作を理解していても、それに依存しないでください。それを理解していない人が必ず存在し、他の人があなたのコードを理解できないからです。

2. void*

void* は「null 型のポインター」を意味し、void* は「任意の型のポインター」または「ポインターはアドレス値に関連付けられているが、このアドレスにあるオブジェクト」を意味します。クリアタイプではありません。」 (どのようなタイプのデータを表すにも void を使用しないのはなぜでしょうか? ご存知のとおり、C/C++ は静的に型付けされた言語です。変数を定義するとメモリが割り当てられます。ただし、変数のタイプが異なれば、占有するメモリも異なります。したがって、C および C++ にはどのような型の変数もありません。ただし、int*、char*、string*、Student* などのすべてのポインター型変数には、同じメモリ空間なので、「任意の型のポインタ」を定義できます。

C++/ANSI C:
void* ポインターは、別のポインターとの比較、関数への void* ポインターの受け渡し、または関数からの void* ポインターの値の代入など、いくつかの限られた操作のみをサポートします。 void* ポインターは、それが指すオブジェクトを操作するために使用することはできません。たとえば、void* ポインターを逆参照することはできません。 void* ポインターでの算術演算は許可されません。
GNU C:
GNU C は、void* ポインターの算術演算が char* と一貫性があることを指定します。

void* は「任意の型のポインタ」を意味し、主にメモリ操作関数の仮パラメータ型と戻り値型で使用されます (メモリ操作はメモリ内のデータ型とは何の関係もありません。つまり、任意の型は許容できる)。

memcpy
プロトタイプ: extern void *memcpy(void *dest, void *src, unsigned int count);
使用法: #include
機能: src が指すメモリ領域から dest が指すメモリ領域に count バイトをコピーします。 。
注: src と dest が指すメモリ領域は重複できません。この関数は dest へのポインターを返します。
注: strcpy と比較すると、memcpy は「」に遭遇しません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。