2016-04-04 20 views
-7

Şu anda qsort işlevi hakkında öğreniyorum ve ben karşılaştırmak işlevini karşılaştı: Biz *(int*)a kullanırken nedenBu ne demek C?

int cmpfunc (const void * a, const void * b) 
{ 
    return (*(int*)a - *(int*)b); 
} 

anlamıyorum. Bu şey nedir ve kullanımı nedir? Neden basit int a yerine const void *a?

+2

Bu forumun kapsamı dışında olan dilin temellerini soruyormuşsunuz gibi geliyor. Bu pasajın hiçbir yerinde görmüyorum) Açıklamak istediğiniz bir ve '*' işaretçiyi göstermek için kullanılır s. Lütfen sorunuzu daraltın ve biraz daha hassas bir şekilde sor. - ** DÜZENLEME: ** Oh, anladım, sen * (int *) a 'hakkında soru soruyorsun ama işaretleme sözdizimine aşina değilsin. –

+0

Her ne kadar, çıkarma işlemi taşma yapabilir ve yanlış karşılaştırmayı geri döndürebileceğinden, bu kötü bir yöntemdir. Buna yapıştır: karşılaştırma. –

+2

@ user5910213 O okudu. Asıl sorumunuz sadece (int) a '' dır çünkü '' '' ları işaretleme olarak değerlendirildi ve sorgunuzun işlendiğinde nasıl görüneceğini görmek için önizlemeyi kontrol etmediniz. – Paulpro

cevap

0

Kodunuz işlevsel bu eşdeğergeçerli: Başka bir deyişle

int cmpfunc(const int* a, const int* b) 
{ 
    return(*a - *b); 
} 

, (int*)a bir tamsayı işaretçi türü içine senin void* a atmalarını.

+0

Çıkarma, taşma yapıp yanlış karşılaştırmayı geri döndürebildiğinden, bu zaten kötü bir yöntemdir. Buna yapıştır: karşılaştırma. –

+0

Bunun aslında herhangi bir şeyde kullanılmayacak olan basitleştirilmiş alıştırma kodu olduğunu varsayabilirim. (Umarım!) –

+3

Onun kodu [qsort] tarafından kullanılabilir (http://www.cplusplus.com/reference/cstdlib/qsort/) ve sizinki yanlış imzası olduğu için yapamazsınız. – Paulpro

3

qsort'un, her türden (yapı dahil) bir diziyi sıralayabildiği varsayıldığından, (karşılaştırma yöntemine argümanlar olarak) karşılaştırılacak şeylerin her birine bir işaretçi gönderir. Bunlar herhangi bir şey olabilir, bu nedenle kullanılan tip, herhangi bir şeye işaret eden "void *" dir. İki int'leri karşılaştırarak olduğunuz için karşılaştırma yöntemi, daha sonra o zaman değerleri karşılaştırmak için o dökme pointer KQUEUE *(int *)

1

dolayısıyla işaret etti. Bu örnekte (Doğru türde bir işaretçi int * o işaretçi kullanması gereklidir (Int *) bir boşluk işaretçisinden önceki "a" değişkeninin bellek adresine bir yazım yapar. * Önceden (int *) bellek adresinin tamsayı değerine erişir. void * a kullanılır çünkü bu jenerik bir işlev, örneğin, iki karakterleri karşılaştırmak için kullanabilirsiniz, örneğin