[C/C++] compare 함수를 공부하며

Will-Big·2023년 4월 17일

Cpp

목록 보기
1/8
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 로 바꾼다는 발상 자체가 말이 안된다는 것이다.

포인터를 상당히 오랜만에 다시 공부하게 되어서 헷갈리는 상황이 많이 발생하는데 종종 포인터에 국한하지 않고 다른 자료형으로 생각해보면 납득이 가는 경우가 꽤 있었다.

profile
개발자가 되고싶어요

0개의 댓글