← 목록으로

🚀 5단계: 포인터 활용하기

배열과 포인터

배열은 메모리에 연속으로 붙어 있는 “방들”이에요. 배열 이름은 사실 “첫 번째 방의 주소”를 가리켜요. 아래 코드는 [실행]으로 바로 결과를 볼 수 있어요.

p가 첫 번째 칸을 가리키고, p+1은 다음 칸(두 번째)을 가리켜요. 그래서 *(p+1)은 arr[1]과 같아요.

함수에서 포인터 쓰기

함수에 “값”을 넘기면 복사만 되고, 원래 변수는 안 바뀌어요. “주소”를 넘기면 함수 안에서 그 주소의 값을 바꿀 수 있어요.

#include <stdio.h>

void 더하기_하다(int *p) {
    *p = *p + 5;   /* p가 가리키는 곳의 값을 5 증가 */
}

int main() {
    int num = 10;
    printf("전: %d\n", num);
    더하기_하다(&num);   /* num의 주소를 넘김 */
    printf("후: %d\n", num);   /* 15가 됨 */
    return 0;
}

&num으로 주소를 넘기니까, 함수 안에서 *p로 그 방의 값을 바꿀 수 있어요. 그래서 num이 15가 돼요.

✅ 5단계 정리

🎉 5단계까지 완료했어요!
이제 “주소”와 “포인터”의 기본을 알게 되었어요. 더 공부하고 싶다면 “포인터와 배열”, “동적 메모리” 같은 걸 찾아 보세요.

📋 실습 과제

과제 1 배열 arr[] = { 10, 20, 30 }을 포인터 p로 받아서, for 반복문으로 *(p+i)를 사용해 모든 원소를 한 줄에 출력하세요.

✏️ 여기서 직접 실습해 보세요

모바일에서도 이 창에서 수정·포맷·실행·복사할 수 있어요. [실행]으로 바로 결과를 볼 수 있습니다.

참고 정답 코드 (클릭하여 펼치기)
#include <stdio.h>

int main() {
    int arr[3] = { 10, 20, 30 };
    int *p = arr;
    for (int i = 0; i < 3; i++)
        printf("%d ", *(p + i));
    printf("\n");
    return 0;
}
과제 2 정수 배열의 합을 구하는 함수 sum_arr(int *p, int n)을 만드세요. main에서 배열을 선언하고 sum_arr(arr, 3)을 호출해 합을 출력하세요.

여기서 직접 작성·실행해 보세요. [실행]으로 결과를 확인할 수 있어요.

과제 2 참고 정답 코드 (클릭하여 펼치기)
#include <stdio.h>

int sum_arr(int *p, int n) {
    int sum = 0;
    for (int i = 0; i < n; i++)
        sum += *(p + i);
    return sum;
}

int main() {
    int arr[3] = { 10, 20, 30 };
    printf("합: %d\n", sum_arr(arr, 3));
    return 0;
}

🔬 심화 학습

포인터 연산: p+1이 실제로 더해지는 값

int *p일 때 p+1은 “다음 정수”를 가리켜요. 정수는 4바이트이므로, 실제 주소에는 4가 더해져요. 컴파일러가 자동으로 계산해 줍니다.

심화 참고 코드 (클릭하여 펼치기)
#include <stdio.h>

int main() {
    int arr[3] = { 10, 20, 30 };
    int *p = arr;
    printf("p   주소: %p\n", (void*)p);
    printf("p+1 주소: %p\n", (void*)(p+1));
    printf("p+2 주소: %p\n", (void*)(p+2));
    return 0;
}

이중 포인터 맛보기

int **pp는 “정수 포인터의 주소”를 저장해요. 즉, 포인터를 가리키는 포인터예요. 나중에 동적 메모리나 함수에서 포인터를 바꿀 때 쓰게 됩니다.