인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

신유진님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C언어

11.8 문자열의 포인터를 정렬하기

11.8 코드 풀이

작성

·

46

1

selectionSort 함수에서 이해가 잘 되지 않는 부분이 있습니다.

void selectionSort(char* arr[], int n)
{
	int i, j, min_idx;

	for (i = 0;i < n - 1;i++)
	{
		min_idx = i;
		for (j = i + 1;j < n;j++)
		{
			if (strcmp(arr[min_idx], arr[j]) > 0) 
				min_idx = j;
		}

		swap(&arr[i], &arr[min_idx]); 
	}
} 

이 함수에서 strcmp()함수를 사용할 때 * indirection을 사용하지 않고 arr[j]를 인자로 대입한 이유가 무엇인지 궁금합니다.

 

arr[j]*(arr + j)와 같아서 이미 indirection을 해준 상태라는 생각이 들긴합니다만

제 생각에는 *arr[j]이 arr 배열 안에 있는 문자열을 가리키는 것이고 arr[j]은 text segment로 저장되어 있는 문자열의 주소를 의미하는 것이 아닌가 하는 생각도 들어서요.

 

*arr[j]어떤 걸 칭하는 것인지 왜 strcmp()함수의 인자로 *arr[j]를 대입하면 작동하지 않는 것인지 궁금합니다.

답변 2

1

Soobak님의 프로필 이미지

안녕하세요? 질문&답변 도우미 Soobak 입니다.

 

*arr[j]arr[j] 가 가리키는 문자열의 첫 번째 문자(char)를 의미합니다.

예를 들어, "hello" 라는 문자열의 경우 다음과 같습니다.

arr[j] = "hello";  // arr[j]는 문자열의 첫 번째 문자를 가리키는 포인터 (char*)
*arr[j] = 'h';     // *arr[j]는 'h' (문자의 값)

이 때, strcmp() 함수의 원형은 int strcmp(const char *str1, const char *str2) 으로,
두 개의 문자열(char*)을 비교하는 함수입니다.

따라서, arr[j] 는 문자열을 가리키는 포인터(char*)이므로 strcmp() 의 인수로 적절하지만,
*arr[j] 는 해당 문자열의 첫 번째 문자(char)이므로 strcmp() 의 인수로 적합하지 않는 것입니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 신유진님.

selectionSort 함수에서는 문자열 배열을 정렬하기 위해 strcmp 함수를 사용하는데요, strcmp 함수는 두 개의 문자열 포인터를 인자로 받아 그들을 비교합니다. 따라서 strcmp(arr[min_idx], arr[j])에서 arr[min_idx]arr[j]는 문자열 포인터로 전달되는 것입니다.

여기서 arr은 문자열의 포인터 배열입니다. 즉, arr[j]는 이미 문자열을 가리키는 포인터를 전달하기 때문에 추가적으로 앞에 *를 사용할 필요가 없습니다. *arr[j]arr[j]가 가리키는 문자열의 첫 번째 문자를 반환하게 됩니다. strcmp 함수는 문자열 전체를 비교해야 하기 때문에 전체 문자열을 가리키는 포인터가 필요합니다.

따라서 strcmp의 인자로는 arr[j]를 전달해야 합니다. *arr[j]를 사용하면 첫 번째 문자만 비교하는 형태가 되어 의도된 문자열 비교가 이뤄지지 않습니다.

참고로 *arr[j]는 개별 문자에 접근할 때 사용하고, 문자열 포인터는 arr[j]로 표현하여 문자열 전체에 접근하게 됩니다.

관련된 설명은 아래 유사 질문들을 참고해 주세요:
- 이중 포인터로 받는 이유

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.