2017-10-14 10 views
0

Student이라는 구조체가 있다고 가정 해 보겠습니다.qsort() - 함수 매개 변수 비교

typedef struct student { 
    int age; 
    char name[10]; 
} Student; 

그리고 학생들에게 일련의 포인터가 있습니다.

Student *a[10]; 

학생들의 이름으로 배열을 정렬해야합니다.

void SortArray(Student *a[], int len){ 
    qsort(a, len, sizeof(Student *), *compare*); 
    printArray(a); 
} 

를 qsort의 마지막 부분은 내가하지 않는 것입니다 :

int compare(const void *a, const void *b){ 
    Student *temp1=*(Student **)a; 
    Student *temp2=*(Student **)b; 
    return strcmp(temp1->name, temp2->name); 
} 

가 그럼 난 정렬하는 기능을 가지고 : 그래서 비교 함수를 썼다. 내가 &compare이라고 썼던 곳과 그렇지 않은 곳을 보았습니다. 내가 &compare을 사용했을 때만 효과가있었습니다.
&을 사용할지 여부를 어떻게 알 수 있습니까?

+2

함수는 배열과 매우 유사합니다. 함수 포인터가 함수 포인터 일 때 사용되면 포인터로 감쇠됩니다. 예를 들어 일반적으로 사용하는 것이 안전합니다.'compare' 만 사용하지만, 코드 독자에게 좀 더 명시 적으로 사용하려면 'compare'를 사용하는 것이 좋습니다. –

+4

데코레이션이 필요하지 않고 '비교'만 전달하면됩니다. – Amit

+0

'& compare'는 정확히 같은 방식으로 명시 적/읽기 쉽습니다.'& array [0]'은 다음과 같습니다 : 언어를 아는 모든 사람들에게 혼란스럽고 추악한 말입니다. 그냥'compare' 또는'array'를 사용하십시오. ** 함수를 호출 할 때마다'func (x)'처럼'func'라는 이름은 포인터로 쇠퇴하고 있습니다. 왜냐하면'()'연산자 (함수 호출)는 피연산자로 함수 포인터를 필요로하기 때문입니다 . –

답변

1

함수에 참조되는 함수의 이름으로 함수 이름을 사용할 수 있습니다. 또한 댓글에서 언급 한 바와 같이 &도 참조 할 만합니다.

0

는 같은 함수를 호출하려고 했습니까 예 :)이 C 표준에 따르면

qsort(a, len, sizeof(Student *), ***********compare); 

또는

qsort(a, len, sizeof(Student *), &***********compare); 

같은 (6.3.2.1 Lvalues, 배열, 기능 지정자)

에 대한

4 기능 지정자는 기능 유형이있는 표현식입니다. 그것은를 sizeof operator65의 피연산자) 또는 단항 & 연산자 ' 함수 리턴 형 포인터'유형 '을 가지는 식으로 변환된다'기능 형 복귀 '형 와 기능 부호 인 경우를 제외 '.

그래서이 표현

***********compare 

에서 함수 지정자 compare는 암시 적으로 다음 차례는 등등 포인터를 작동하려면 다시 함수 타입으로 변환에이 역 참조 적용 포인터를 함수로 변환됩니다.

물론 필요하지는 않지만 명시 적으로 &compare을 지정할 수 있습니다. 여기

#include <stdio.h> 

void f(void) 
{ 
    puts("Hello eitanmayer"); 
} 

void g(void f(void)) 
{ 
    f(); 
} 

int main(void) 
{ 
    g(&******f); 
} 

출력 그래서 코드에 문제가 다른 곳이 될 수

Hello eitanmayer 

하는 시범 프로그램을이다.