私のコードでは:
int number_compare(void *val1, void *val2) {
if (*(int*) val1 < *(int*s) val2) {
したがって、基本的に void* から int に変換するには、*(int *) をキャストする必要があります。
これは機能し、正しい結果が得られます。理由を教えてください。または、それを説明するスレッドを教えてください。私はすでに見ましたが、理解できる答えが見つかりません。
私のコードでは:
int number_compare(void *val1, void *val2) {
if (*(int*) val1 < *(int*s) val2) {
したがって、基本的に void* から int に変換するには、*(int *) をキャストする必要があります。
これは機能し、正しい結果が得られます。理由を教えてください。または、それを説明するスレッドを教えてください。私はすでに見ましたが、理解できる答えが見つかりません。
void *
それは aを に変換していませんint
。void *
が指しているものを として解釈していint
ます。それを分解してください:
val1 // void pointer - not dereferenceable
(int *)val1 // pointer to 'int'
*(int *)val1 // the 'int' being pointed to
したがって、関数には 2 つのポインターが渡されます。次に、それらをポインターとして解釈し、逆参照して、指している 2 つの値int
を比較します。int
対照的に、 avoid *
から an への変換は次のint
ようになります。
int x = (int)val1;
しかし、それはあなたが望むものではないことはほぼ確実int
ですint
.
まず、void ポインターは逆参照できません。おそらく、データを取得する方法がまだわかっていないためです。(つまり) その char が 1 バイトをフェッチする必要がある場合、int は 4 バイト...
したがって、ここでは最初に、いくつかのアドレス (void ポインター) を int ポインターに変換しています。
(int*) val1;
後でそのアドレスから値を取得します [これで、システムはそのアドレスから 4 バイトのデータを取得する必要があることを認識しました: val1]。
*(int*)val1
これにより、そのアドレスのデータが得られます。
これは正式には、データを指定された data_type にキャストする「(data_type) データ」をキャストすると言われています。