포인터와 메모리

포인터 연산

Typed pointer에 1을 더하면 한 byte가 아니라 한 element 이동합니다.

포인터 연산이란?

Typed pointer에 1을 더하면 한 byte가 아니라 한 element 이동합니다.

Pointer와 iterator로 연속 메모리를 순회합니다.

중요한 점

  • 포인터는 살아 있는 호환 객체를 가리키거나 null이어야 합니다.
  • 소유한 allocation은 정확히 한 번 해제하세요.
  • Ownership과 const를 명확히 표현하세요.

C와 C++ 코드 예제

C
실행 →
main.c
#include <stdio.h>

int main(void) {
    int values[] = {10, 20, 30, 40};
    int sum = 0;
    for (int *p = values; p < values + 4; ++p) sum += *p;
    printf("sum=%d distance=%td\n", sum, (values + 4) - values);
    return 0;
}
예상 출력
sum=100 distance=4
C++
실행 →
main.cpp
#include <iostream>
#include <vector>

int main() {
    std::vector values{10, 20, 30, 40};
    int sum = 0;
    for (auto it = values.begin(); it != values.end(); ++it) sum += *it;
    std::cout << "sum=" << sum << " distance="
              << std::distance(values.begin(), values.end()) << '\n';
}
예상 출력
sum=100 distance=4

C와 C++ 비교

같은 array에서 one-past-end까지만 정의됩니다. C++ iterator는 이를 여러 container로 확장합니다.

C

Ownership과 cleanup은 개발자가 지켜야 하는 규칙입니다.

C++

Container와 RAII가 ownership과 cleanup을 lifetime에 연결합니다.

연습 문제

두 버전을 실행하고 수정하여 각 언어의 보장을 관찰하세요.

  • null과 할당 실패를 테스트하세요.
  • AddressSanitizer와 UndefinedBehaviorSanitizer를 실행하세요.
  • 각 pointer의 ownership을 문서화하세요.