Menu
Coddy logo textTech

포인터 연산

Coddy C 여정의 Logic & Flow 섹션에 포함된 레슨 — 63개 중 9번째.

여러분은 *(array + i)와 같은 포인터 표기법을 사용하여 배열 요소에 액세스하는 방법을 배웠습니다. 이제 훨씬 더 강력한 기술인 포인터 산술을 배우게 될 것입니다. 이는 단순한 증감 연산을 사용하여 메모리 내에서 포인터를 이동할 수 있게 해줍니다.

포인터를 ++로 증가시키거나 --로 감소시킬 때, 포인터는 단순히 1바이트씩 이동하지 않습니다. 대신, 포인터가 가리키는 데이터 타입의 크기만큼 이동합니다. 정수형 포인터의 경우, ptr++sizeof(int) 바이트만큼 앞으로 이동하여 메모리상의 정확히 다음 정수 위치에 도달하게 됩니다.

int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers;    // 첫 번째 요소(10)를 가리킵니다
ptr++;                 // 이제 두 번째 요소(20)를 가리킵니다
ptr++;                 // 이제 세 번째 요소(30)를 가리킵니다

이러한 자동 크기 계산은 포인터 연산(pointer arithmetic)을 매우 강력하고 편리하게 만들어 줍니다. 바이트 계산에 대해 걱정할 필요가 없습니다. C는 포인터의 데이터 타입(data type)을 기반으로 메모리 주소 지정을 대신 처리해 줍니다.

포인터 연산은 루프에서 배열을 순회할 때 특히 유용합니다. 배열 인덱스를 사용하는 대신, 포인터를 증가시켜 각 요소를 순차적으로 이동할 수 있으며, 이는 종종 더 효율적인 코드를 만들어 줍니다.

challenge icon

챌린지

쉬움

포인터 증감 연산을 사용하여 배열을 탐색하고 처리함으로써 포인터 산술을 보여주는 C 프로그램을 작성하세요. 프로그램은 다음을 수행해야 합니다:

  1. 5개의 요소를 가진 data라는 이름의 정수 배열을 선언하고 {12, 24, 36, 48, 60} 값으로 초기화합니다.
  2. ptr이라는 이름의 정수 포인터를 선언하고 배열의 첫 번째 요소를 가리키도록 초기화합니다.
  3. 포인터 산술만을 사용하여 전체 배열을 탐색하는 5회 반복 for 루프를 사용합니다.
  4. 루프 내부에서:
    • 역참조 연산자를 사용하여 ptr이 가리키는 현재 값을 출력합니다.
    • %p 형식 지정자를 사용하여 ptr에 저장된 메모리 주소를 출력합니다.
    • ptr++를 사용하여 포인터를 증가시켜 다음 요소로 이동합니다.
  5. 루프가 끝난 후, ptr이 배열의 첫 번째 요소를 다시 가리키도록 재설정합니다.
  6. 포인터 산술을 사용하여 *(ptr + 2)로 세 번째 요소(인덱스 2)에 직접 접근하고 출력합니다.
  7. 포인터 산술을 사용하여 *(ptr + 4)로 마지막 요소(인덱스 4)에 직접 접근하고 출력합니다.

출력 결과는 다음과 같은 형식으로 표시되어야 합니다:

Value: 12, Address: [address]
Value: 24, Address: [address]
Value: 36, Address: [address]
Value: 48, Address: [address]
Value: 60, Address: [address]
Third element: 36
Last element: 60

이 챌린지는 포인터 증감 연산이 데이터 타입의 크기만큼 자동으로 이동하는 방식과, 기본 포인터 위치로부터 특정 오프셋에 있는 배열 요소에 접근하기 위해 포인터 산술을 사용하는 방법에 대한 이해도를 테스트합니다.

치트 시트

포인터 연산(Pointer arithmetic)을 사용하면 증감 연산을 통해 메모리 내에서 포인터를 이동할 수 있습니다. 포인터를 증가시키면 1바이트가 아니라 가리키는 데이터 타입의 크기만큼 이동합니다.

기본적인 포인터 연산 작업:

int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers;    // 첫 번째 요소(10)를 가리킴
ptr++;                 // 이제 두 번째 요소(20)를 가리킴
ptr++;                 // 이제 세 번째 요소(30)를 가리킴

포인터 연산을 사용하여 특정 오프셋에 있는 요소에 접근할 수도 있습니다:

*(ptr + 2)  // 현재 위치에서 오프셋 2에 있는 요소에 접근

포인터 연산은 루프에서 배열을 순회할 때 유용하며, 종종 배열 인덱스를 사용하는 것보다 더 효율적인 코드를 생성합니다.

직접 해보기

#include <stdio.h>

int main() {
    // TODO: 여기에 코드를 작성하세요
    // {12, 24, 36, 48, 60} 값을 가진 배열 'data'를 선언하고 초기화합니다
    // 포인터 'ptr'을 선언하고 첫 번째 요소를 가리키도록 초기화합니다
    // 포인터 산술 연산을 사용하는 for 루프를 통해 배열을 순회합니다
    // 각 값과 주소를 출력한 다음 포인터를 증가시킵니다
    // 포인터를 재설정하고 포인터 산술 연산을 사용하여 특정 요소에 접근합니다
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Logic & Flow의 모든 레슨