Learning
레슨 2 / 8·20분

포인터와 배열

포인터 기초

포인터는 메모리 주소를 저장하는 변수입니다. *(역참조 연산자)로 주소의 값에 접근하고, &(주소 연산자)로 변수의 주소를 얻습니다. C의 핵심이자 가장 강력한 기능입니다.

c
#include <stdio.h>

int main() {
    int x = 42;
    int *ptr = &x;  // ptr은 x의 주소를 저장

    printf("x의 값: %d\n", x);        // 42
    printf("x의 주소: %p\n", &x);      // 0x7ffd...
    printf("ptr의 값: %p\n", ptr);     // 같은 주소
    printf("ptr이 가리키는 값: %d\n", *ptr);  // 42

    // 포인터를 통해 값 변경
    *ptr = 100;
    printf("x의 새 값: %d\n", x);  // 100

    return 0;
}

배열과 포인터 연산

C에서 배열 이름은 첫 번째 요소의 주소와 같습니다. 포인터 연산(pointer arithmetic)으로 배열 요소를 순회할 수 있습니다.

c
#include <stdio.h>

int main() {
    // 배열 선언
    int numbers[5] = {10, 20, 30, 40, 50};

    // 인덱스로 접근
    for (int i = 0; i < 5; i++) {
        printf("numbers[%d] = %d\n", i, numbers[i]);
    }

    // 포인터 연산으로 접근
    int *p = numbers;  // 배열 이름 = 첫 요소 주소
    for (int i = 0; i < 5; i++) {
        printf("*(p + %d) = %d\n", i, *(p + i));
    }

    // 문자열 = char 배열
    char greeting[] = "Hello";
    printf("%s\n", greeting);
    printf("길이: %lu\n", sizeof(greeting));  // 6 (\0 포함)

    return 0;
}
c
#include <stdio.h>

// 포인터로 값 교환 (swap)
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 3, y = 7;
    printf("교환 전: x=%d, y=%d\n", x, y);
    swap(&x, &y);
    printf("교환 후: x=%d, y=%d\n", x, y);
    // 교환 전: x=3, y=7
    // 교환 후: x=7, y=3
    return 0;
}
💡

초기화되지 않은 포인터나 해제된 메모리를 참조하면 정의되지 않은 동작(Undefined Behavior)이 발생합니다. 포인터는 항상 유효한 주소를 가리키도록 주의하세요.