4

私のコードでは:

int number_compare(void *val1, void *val2) {
    if (*(int*) val1 < *(int*s) val2) {

したがって、基本的に void* から int に変換するには、*(int *) をキャストする必要があります。

これは機能し、正しい結果が得られます。理由を教えてください。または、それを説明するスレッドを教えてください。私はすでに見ましたが、理解できる答えが見つかりません。

4

2 に答える 2

7

void *それは aを に変換していませんintvoid *が指しているものを として解釈してい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.

于 2013-05-31T17:03:43.893 に答える
3

まず、void ポインターは逆参照できません。おそらく、データを取得する方法がまだわかっていないためです。(つまり) その char が 1 バイトをフェッチする必要がある場合、int は 4 バイト...

したがって、ここでは最初に、いくつかのアドレス (void ポインター) を int ポインターに変換しています。

(int*) val1;

後でそのアドレスから値を取得します [これで、システムはそのアドレスから 4 バイトのデータを取得する必要があることを認識しました: val1]。

*(int*)val1 

これにより、そのアドレスのデータが得られます。

これは正式には、データを指定された data_type にキャストする「(data_type) データ」をキャストすると言われています。

于 2013-05-31T17:08:14.347 に答える