C언어: qsort 함수
qsort
<stdlib.h>
헤더에 정의됨
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void*, const void*));
base
: 배열의 첫 번째 요소를 가리키는 포인터
nmemb
: 멤버 수
size
: 각 멤버 또는 요소의 크기
compar
: 비교 함수에 대한 포인터
주의사항
비교 대상(즉, 배열 내 요소)으로의 포인터에 해당하는 argument가 const void*
형이다.
-
상수 포인터이므로 포인터가 가리키는 대상을 변경 불가능하다.
-
void*
형이므로 그대로 역참조에 사용할 수 없고 비교 대상에 따라 함수 내부에서 적절한 캐스팅이 필요하다.
문자열의 배열(char* 형 배열)을 정렬 시, 비교 함수 작성에 유의
int compare_strings(const void* p, const void* q)
{
return strcmp(*(char**)p,*(char**)q); //p,q는 문자열을 가리키는 char*형 포인터를 가리키는 포인터의 주소이므로 char**형으로 캐스팅이 필요하다.
}
비교 함수의 argument에 전달되는 것은 문자열이 아니라 각 배열 요소에 해당하는 문자열을 가리키는 포인터이므로, 비교 대상 문자열들을 strcmp
에 전달하기 위해서는 char**
형으로의 캐스팅 이후 역참조가 필요하다.