パラメータでポインタを渡す5つの関数が見られ、それらは動的な使用で一般的であり、いくつかの手順の後にさまざまな関数を実行します。しかし、私はヘッダーファイルでこの表現に出くわしました:
void *allocate_mem(u_int32_t n);
それがどのように使用されるかについての手がかりはありますか?関数はポインターですか、それともポインターを返しますか?
パラメータでポインタを渡す5つの関数が見られ、それらは動的な使用で一般的であり、いくつかの手順の後にさまざまな関数を実行します。しかし、私はヘッダーファイルでこの表現に出くわしました:
void *allocate_mem(u_int32_t n);
それがどのように使用されるかについての手がかりはありますか?関数はポインターですか、それともポインターを返しますか?
私のコメントを参照してください。
このような質問がある場合は、 cdecl.orgを使用してください...入力するvoid *allocate_mem(u_int32_t)
と、次のようになります。
へのポインタを返す
allocate_mem
関数()として宣言します。u_int32_t
void
だから、私たちはallocate_mem
リターンを知っていますvoid *
。さて、あなたはおそらくあなたがなぜあなたがへのポインタを欲しがるのか疑問に思っているでしょうvoid
...
C99標準の§6.3.2.3.1は次のように述べています。
へのポインタ
void
は、任意の不完全な型またはオブジェクト型へのポインタから、またはポインタから変換される可能性があります。不完全なタイプまたはオブジェクトタイプへのポインタは、へのポインタに変換されたりvoid
、元に戻ったりする場合があります。結果は元のポインタと同じになります。
allocate_mem
したがって、の結果をニーズに合わせて変換できます。
float *data = allocate_mem(1024 * sizeof(float))
この関数は、割り当てられた新しいメモリへのポインタを返します。
戻り値の型はvoid*です。これは、関数がそれを何に使用したいかを知らないためです。
整数の配列として使用する場合は、int*にキャストします。
例えば。
int *p = allocate_mem(4*10);
引数は、割り当てる必要のあるメモリのサイズ(バイト)です。したがって、4バイト整数に40バイトを割り当てると、10個の4バイト整数の配列になります。
Avoid *
は何かへのポインタです。それが何を指しているのかは不明ですが、それが一種の中立的なポインターとして機能するという考えです。void*
paramは、あらゆる種類のポインタ型をとることができます。ただし、これらのポインタには独自の制限があるため、これらのポインタを処理する際には細心の注意を払う必要があります。void *を逆参照することはできません。これは、有効な型にキャストする必要があります。同じことがポインタ演算の適用にも当てはまります。
詳細については、この説明を参照してください-C-関数内のポインタとvoid変数型?