이 Step에서 다루는 것

  • 포인터에서 자주 쓰는 연산자 &, *, ->의 역할을 “한 문장”으로 설명하기
  • . vs ->를 헷갈리지 않게 구분하기
  • 가장 흔한 실수: *ptr.hp 같은 우선순위 실수를 왜 괄호로 막아야 하는지

학습 목표

  • &x는 주소, *p는 따라가기(역참조)라는 의미를 자동으로 떠올릴 수 있다.
  • 구조체/클래스에서 “값이면 . / 포인터면 ->”를 자동으로 구분할 수 있다.

연산자 정리

연산자이름설명
&주소 연산자변수의 주소를 가져옴
*간접 연산자 (역참조)포인터가 가리키는 주소의 값을 읽거나 수정
+, -산술 연산자포인터가 타입 크기 단위로 이동
->간접 멤버 연산자구조체 포인터가 멤버에 접근할 때 사용

핵심 한 줄 요약:

  • & = “주소를 얻는다”
  • * = “주소를 따라가서 값을 건드린다”
  • -> = “포인터로 따라가서(역참조) 멤버에 접근한다”

구조체 포인터 멤버 접근

struct StatInfo
{
    int hp;
    int attack;
    int defence;
};

StatInfo monster;
StatInfo* ptr = &monster;

(*ptr).hp = 100;   // 방법 1
ptr->hp = 100;     // 방법 2 (동일, 더 간편)
  • ptr은 주소. *ptr로 순간이동해 구조체에 도착. 그다음 .hp로 멤버 접근.
  • ->(*ptr).hp의 축약형. 포인터로 관리할 때 -> 사용.

우선순위 실수(초보자 최다 실수)

  • 아래 코드는 의도와 다르게 해석될 수 있어 위험합니다.
// 의도: (*ptr).hp
// 실수: *ptr.hp  (컴파일 에러 또는 전혀 다른 의미)

그래서 안전하게 항상 괄호를 씁니다.


nullptr 안전 규칙

  • ptrnullptr일 수 있다면, ptr->hp는 바로 크래시로 이어질 수 있습니다.
  • 습관:
if (ptr == nullptr)
    return;

ptr->hp = 100;

점(.) vs 화살표(->)

  • 일반 변수 (값): monster.hp → 점 사용.
  • 포인터 (주소): ptr->hp → 화살표 사용. (먼저 역참조한 뒤 멤버 접근)

체크 질문 (스스로 답해보기)

  • ptr->hp(*ptr).hp와 완전히 같은 의미일까?
  • ptrnullptr이면 ptr->hp는 왜 위험할까?
  • monster.hpptr->hp의 차이는 “값/주소” 관점에서 무엇일까?

profile
李家네_공부방

0개의 댓글