2012-07-05 4 views
1

코드는 here에서 가져 왔습니다.qsort 비교 함수에 인수를 전달해야하는 이유는 무엇입니까?

* qsort example */ 
#include <stdio.h> 
#include <stdlib.h> 

int values[] = { 40, 10, 100, 90, 20, 25 }; 

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

int main() 
{ 
    int n; 
    qsort (values, 6, sizeof(int), compare); 
    for (n=0; n<6; n++) 
    printf ("%d ",values[n]); 
    return 0; 
} 

우리는 서명의 매개 변수와 비교 기능을 가지고 있지만 우리가 qsort가 그것을 호출 할 때 인수가 전달되지 않습니다. ab의 값은 어떻게 함수에 전달됩니까? 감사합니다

+0

는 질문과 관련,하지만 당신은 당신의 배열에 정수의 범위는 INT_MAX''에 의해 제한되는 선험적으로 알고하지 않는 한 비교 기능은 주요 버그가 없습니다. cplusplus.com는 C와 C++ 정보에 대한 atrociously 나쁜 소스 이유 –

+0

@R .. 난 그냥 cpluscplus.com에서 감사를했다 뭐하는거야? – Steve

+0

또 다른 이유는 ... –

답변

4

:

qsort (values, 6, sizeof(int), compare); 

함수가 그 기능 (아닌 함수 호출)의 포인터로 붕괴 식별 표현식 compare.

:

qsort (values, 6, sizeof(int), &compare); 

이 (당신이 또는 전에 보지 않았을 수도 있지만 더 자주 질문되는) 함수에 인수로 사용하는 경우 배열하는 일이 정확히 같은 일이 : 코드는 효과적으로 동일합니다

void f(int * x); 
int main() { 
    int array[10]; 
    f(array);  // f(&array[0]) 
} 
+0

그래서 앰퍼샌드 단지 게으른 방법없이 함수 포인터를 작성하지만 – Steve

+1

함수 호출에서 컴파일러는 포인터에 대한 함수를 함수로 변환합니다. 그 이유는 배열과 마찬가지로 함수를 실제로 값으로 전달할 수 없기 때문에 언어에는 함수 선언과 호출에서 변환을 수행하는 특정 규칙이 있습니다. 'typedef void function(); void f (function f);'는 선언에서'typedef void function();'void f (function * f);'로 변환되고'f (myvoidfunction) '는' 전화의 장소. –

+0

나는 그것을 게으른 방법이라고 부르지 않을 것이다. 나는 그것을 일관된 방법이라고 부를 것이다. '()'연산자 (즉, 함수 호출 연산자)는 함수 포인터를 피연산자로 취합니다. 함수 호출을 할 때마다'(& function) (...);을 쓰지 않는 한, non-call 목적을 위해 함수의 주소를 사용하고자 할 때'& function'을 쓰는 것이 일관성이 없습니다. –

1

qsort는 비교하고자하는 배열의 어느 항목의 주소를 전달합니다. 예 : &values[3]&values[5]. 정말 배열의 항목의 실제 유형을 알고하지 않기 때문에

, 그것은 정확하게 주소를 계산하기 위해 size 매개 변수를 사용합니다. 예를 들어이 구현을 참조하십시오 : qsort가를 호출 할 때 http://insanecoding.blogspot.ie/2007/03/quicksort.html

3

, 당신은 당신이 매개 변수를 지정하지 않은 이유는 함수에 대한 포인터를 전달하고 있습니다. qsort가 구현 내부

의 '값'배열에서 값을 choses 및 "비교"기능을 호출한다. 그것이 'a'와 'b'가 통과하는 방법입니다. 이 식의 문맥에서

관련 문제