私は、慣れ親しんでいない関数宣言を持つほとんどのCプログラムで見られるものと混同されています。
void *func_name(void *param){
...
}
*
は関数を意味しますか? (*
)変数タイプでは、別の変数へのポインタを作成するため、後者の変数がメモリに格納されているアドレスを追跡できます。しかし、この関数の場合、この*
アスタリスクは意味します。
アスタリスクは、関数名ではなく戻り値の型に属します。つまり、次のとおりです。
void* func_name(void *param) { . . . . . }
これは、関数がvoid pointerを返すことを意味します。
*は、void *
である関数の戻り値の型を指します。
ポインター変数を宣言するとき、*
を変数名または変数タイプの近くに配置するのと同じことです。
int *a;
int* a;
個人的には、,
セパレータを使用して複数のポインターを定義する場合は、毎回*
を繰り返す必要があるため、最初の選択がより明確であると考えています。
int *a, *b;
この場合、「型に近い構文」を使用すると誤解を招く可能性があります。
int* a, b;
Int(a
)とint(b
)へのポインターを宣言しています。
そのため、関数の戻り値の型にもその構文があります!
*
は戻り型に属します。この関数は、void *
、指定されていないタイプのメモリ位置へのポインタを返します。
ポインターは、それ自体が値として何らかのメモリー位置のアドレスを持つ変数タイプです。 Cのさまざまなポインタータイプは、ポインター変数が参照するメモリ位置にあると予想されるさまざまなタイプを表します。したがって、int *
は、int
として解釈できる場所を参照することが期待されます。ただし、void *
は、指定されていない型のメモリ位置を参照するポインター型です。そのようなvoidポインターをキャストして、それが参照するメモリー位置にあるデータにアクセスできるようにする必要があります。
これは、関数がvoid*
を返すことを意味します。