레슨 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)이 발생합니다. 포인터는 항상 유효한 주소를 가리키도록 주의하세요.