&(주소 얻기), *(역참조/따라가기)int* p = &x; *p = 10;이 의미하는 바를 말로 설명할 수 있다.AddHp(hp, 20)처럼 값을 넘기는 함수는 기본적으로 “복사본”을 받습니다.hp += 20;을 해도 main의 hp(원본) 은 바뀌지 않습니다.| 항목 | 설명 |
|---|---|
| 개념 | 메모리 주소를 담는 변수 |
| 크기 | 32bit면 보통 4byte, 64bit면 보통 8byte (플랫폼/빌드에 따라 달라짐) |
| 타입 | int* → “이 주소에 int가 있다고 가정하고 접근하겠다”는 약속 |
int* ptr;에서 ptr은 int의 주소를 담겠다는 의미입니다.0과 구분되는 의미라서, 가능하면 nullptr를 쓰는 습관이 좋습니다.개념 그림(주소를 담고, 따라가서 값에 접근):
int hp = 100;
int* ptr = &hp;
ptr ──(hp의 주소를 담음)──▶ hp(100)
*ptr ──(그 주소로 가서)────▶ hp의 값(100)
&&변수 → 해당 변수의 메모리 주소를 가져옴.ptr = &hp → hp의 주소를 ptr에 저장.int hp = 100;
int* ptr = &hp; // hp의 주소를 ptr에 저장
**ptr → ptr이 가리키는 주소에 있는 값을 읽거나 수정합니다.*ptr = 200 → 원본 hp가 200으로 바뀜.int a = 10;
int* p = &a;
*p = 20; // a의 값이 20으로 바뀜
ptr이 nullptr이거나 쓰레기 값이면 *ptr는 터질 수 있습니다.*ptr로 접근할 때 컴파일러는 “그 주소에 무엇이 있는지”를 포인터 타입으로 판단합니다.메모리 오염은 “지금 안 터지고” 한참 뒤에 터질 수 있어서 디버깅 난이도가 급상승합니다.
int hp = 100;
float* fptr = (float*)&hp; // int를 float처럼 해석 → 데이터 왜곡/버그 가능
위 같은 캐스팅은 학습 단계에서 “왜 위험한지”를 알기 위한 예시입니다.
실무에서는 이런 코드가 나오면 “정말 의도한 게 맞나?”부터 의심하는 게 일반적입니다.
void AddHp(int* hp, int value) {
*hp += value; // 주소 타고 가서 원본 수정
}
int main() {
int hp = 100;
AddHp(&hp, 10);
std::cout << hp << '\n'; // 110
}
&hp로 주소 전달. *hp로 그 주소의 값을 직접 수정.void AddHpSafe(int* hp, int value)
{
if (hp == nullptr)
return;
*hp += value;
}
int* p = &a;에서 p가 들고 있는 것은 “a의 값”인가 “a의 주소”인가?*p = 20;이 실행되면 바뀌는 건 무엇인가?