작성
·
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 입니다.
*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 인턴입니다. 신유진님.
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]
로 표현하여 문자열 전체에 접근하게 됩니다.
관련된 설명은 아래 유사 질문들을 참고해 주세요:
- 이중 포인터로 받는 이유
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.