포인터 비교
Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 10번째.
포인터 연산을 사용하여 배열을 이동하는 방법을 배웠습니다. 이제 포인터도 일반 변수와 동일한 관계 연산자를 사용하여 비교할 수 있다는 것을 알게 될 것입니다: ==, !=, <, 그리고 >.
두 개의 포인터를 비교할 때, 여러분은 그들의 메모리 주소를 비교하는 것입니다. 이는 두 포인터가 모두 동일한 배열 내의 요소를 가리킬 때 특히 유용하며, 이를 통해 메모리 내에서의 상대적인 위치를 확인할 수 있습니다.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // 첫 번째 요소를 가리킵니다
int *end = numbers + 4; // 마지막 요소를 가리킵니다
if (start < end) {
printf("start comes before end in memory");
}포인터 비교는 루프 조건에서 특히 강력해집니다. 카운터 변수를 사용하는 대신, 현재 포인터 위치를 대상 포인터와 비교하여 루프가 중지되어야 할 시점을 제어할 수 있습니다. 이는 배열 순회를 위한 우아하고 효율적인 코드를 생성합니다.
핵심적인 통찰은 ptr1 < ptr2가 ptr1이 ptr2가 가리키는 요소보다 배열에서 더 앞쪽에 위치한 요소를 가리킨다는 것을 알려준다는 점입니다. 이러한 관계 덕분에 포인터 비교는 배열을 순차적으로 처리하는 루프를 제어하는 데 매우 적합합니다.
챌린지
쉬움포인터 비교를 사용하여 배열을 순회하고 특정 범위 내의 요소를 찾는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:
- 8개의 요소를 가진
scores라는 이름의 정수 배열을 선언하고 {45, 78, 92, 63, 87, 34, 91, 56} 값으로 초기화합니다. - 정수를 가리키는 두 개의 포인터
start_ptr와end_ptr를 선언합니다. start_ptr가 배열의 첫 번째 요소를 가리키도록 설정합니다.- 포인터 산술을 사용하여
end_ptr가 배열의 마지막 요소를 가리키도록 설정합니다. current_ptr라는 이름의 포인터를 선언하고 첫 번째 요소를 가리키도록 초기화합니다.- 포인터 비교(
current_ptr <= end_ptr)를 사용하는 while 루프를 통해 배열을 순회합니다. - 루프 내부에서:
- 현재 값이 60에서 90 사이(포함)인지 확인합니다.
- 값이 범위 내에 있으면 "Value [value] is in range"를 출력합니다.
- 값이 범위 내에 없으면 "Value [value] is out of range"를 출력합니다.
current_ptr를 증가시켜 다음 요소로 이동합니다.
- 루프가 끝난 후, 포인터 비교를 사용하여
current_ptr > end_ptr인지 확인하여current_ptr가 배열의 끝을 넘어섰는지 검증합니다. - 조건이 참이면 "Traversal complete"를 출력합니다.
출력 결과는 다음과 같은 형식으로 표시되어야 합니다:
Value 45 is out of range
Value 78 is in range
Value 92 is out of range
Value 63 is in range
Value 87 is in range
Value 34 is out of range
Value 91 is out of range
Value 56 is out of range
Traversal complete이 챌린지는 루프 조건에서의 포인터 비교 연산자 이해, 포인터 산술을 사용한 경계 포인터 설정, 그리고 포인터 비교가 전통적인 카운터 기반 루프보다 어떻게 더 우아하게 배열 순회를 제어할 수 있는지 테스트합니다.
치트 시트
포인터는 관계 연산자인 ==, !=, <, 그리고 >를 사용하여 비교할 수 있습니다.
포인터를 비교할 때는 메모리 주소를 비교하게 됩니다. 이는 동일한 배열 내에서 요소들의 상대적인 위치를 결정하는 데 유용합니다.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // Points to first element
int *end = numbers + 4; // Points to last element
if (start < end) {
printf("start comes before end in memory");
}포인터 비교는 루프 조건에서 특히 강력하며, 카운터 변수를 사용하는 대신 포인터 위치를 비교하여 루프를 제어할 수 있게 해줍니다:
int *current_ptr = numbers;
int *end_ptr = numbers + 4;
while (current_ptr <= end_ptr) {
// Process current element
current_ptr++; // Move to next element
}ptr1 < ptr2라는 표현식은 ptr1이 가리키는 요소가 ptr2가 가리키는 요소보다 배열 내에서 더 앞쪽에 위치함을 의미합니다.
직접 해보기
#include <stdio.h>
int main() {
// TODO: 아래에 코드를 작성하세요
return 0;
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.