int compare1(const void* a, const void* b)
{
return strcmp(*(const char**)a, *(const char**)b);
}
int compare2(const void* a, const void* b)
{
int A = *(int*)a;
int B = *(int*)b;
if (A < B)
return -1;
else if (A > B)
return 1;
else
return 0;
}
int main(void)
{
const char* aList[5] = { "abb", "aaa", "ddd", "eee", "ccc" };
int nList[5] = { 4,3,2,5,1 };
qsort(aList, 5, sizeof(const char*), compare1);
qsort(nList, 5, sizeof(int), compare2);
for (size_t i = 0; i < 5; i++)
{
cout << aList[i] << endl;
cout << nList[i] << endl;
}
return 0;
}
처음 위 코드를 작성했을 때 compare1 에서 굳이 번거롭게 void* -> const char* 로 직접 변환하면 될 것을 ** 로 변환하고 다시 역참조를 하는지 이해가 안갔다. 주변에 자문을 구해봤지만 잘 이해가 안가서 다른 변수를 인자로 받는 코드를 만들어 보았고 그것이 compare2 다.
compare2 로 만들면서 느꼈던 것은 당연히 * 로 변환하고 역참조를 해야한다고 생각했다는 것이다. compare1 에서 주장했던 것과 같은 논리를 해보자면 void* 로 들어온 값을 억지로 int 로 변환한다는 것인데 포인터로 들어온 자료형을 갑자기 int 로 바꾼다는 발상 자체가 말이 안된다는 것이다.
포인터를 상당히 오랜만에 다시 공부하게 되어서 헷갈리는 상황이 많이 발생하는데 종종 포인터에 국한하지 않고 다른 자료형으로 생각해보면 납득이 가는 경우가 꽤 있었다.