코가손의 블로그
C++ 포인터 & 참조 본문
▶ 포인터
선언
int number = 1;
int* pointer;
pointer = &number;
포인터는 주소를 담을 수 있고
int 타입이든 char 타입이든 컴파일러(32bit->4바이트, 64bit->8바이트)에 따라
고정된 크기의 주소가 할당된다.
산술 연산자 +-
pointer += 1;
포인터형에 1을 더하면 주소값이 4가 증가한다.
int형은 4바이트의 크기를 가지고 있기 때문이다.
포인터 타입에 따라 증가하는 주소값이 달라진다.
간접 연산자
*pointer = 3;
pointer가 가리키는 주소의 값을 3으로 변경한다.
*pointer식으로 포인터가 가리키는 값(주소)에 접근할 수 있다.
간접 멤버 연산자 ->
// player클래스를 가리키는 playerPtr있다고 가정
playerPtr->hp = 400;
playerPtr->damage = 50;
(*playerPtr).hp 를 playerPtr->hp 로 간단히 표현할 수 있다.
▶ 참조
struct StatInfo{
int hp;
int attack;
int defence;
};
// 포인터 방식
void CreateMonster(StatInfo* info)
{
info->hp = 100;
info->attack = 8;
info->defence = 5;
}
// 값 복사 방식
void CreateMonster(StatInfo info)
{
info.hp = 100;
info.attack = 8;
info.defence = 5;
}
어떠한 로직에 StatInfo가 필요하다. StatInfo클래스의 정보를 넘겨주는 방식에는
2가지 방법, 값 복사 방식과 포인터 방식, 참조전달 방식이 있다.
값 복사 방식
void CreateMonster() 함수의 매개변수로 StatInfo 방식으로 값을 넘겨준다면 스택프레임에 쌓이는 형태는 다음과 같다.
- 스택 프레임
[매개변수][RET주소][지역변수(info)] [매개변수(info(100, 8, 5)][RET주소][지역변수]
값 복사 방식으로 전달을 하면 스택 프레임에 Statinfo클래스 크기만큼 자원을 사용한다.
이것이 간단한 클래스라면 괜찮지만 엄청난 크기의 정보를 가지고 있는 클래스를
값 복사 방식으로 전달한다면 스택 영역에 무리를 줄 수 있는 스택 프레임을 생성하게 되며
스택 오버플로우가 발생할 수 있다.
포인터 방식
- 스택 프레임
[매개변수][RET주소][지역변수(info)] [매개변수(&info)][RET주소][지역변수]
주소 접근으로 값 변경 시 자원이 적게 든다.
참조 전달 방식
int number = 1;
int& reference = number;
참조는, 1이라는 값을 number로도 접근이 가능하고 reference로 접근이 가능하도록 해준다.
// 참조 전달 방식
void CreateMonster(StatInfo& info)
{
info.hp = 100;
info.attack = 8;
info.defence = 5;
}
포인터 방식은 info->hp 로 접근해야 한다.
참조 방식은 info.hp 로 간단하게 사용할 수 있다.
단점은 값 복사 방식인지, 참조 전달 방식인지 모르고 지나칠 수 있다는 것
따라서 참조 전달을 할 경우에 보통 const를 붙여 참조 전달이라는 힌트를 주어야 한다.
const도 어디에 위치하느냐에 따라 결과가 달라진다.
void PrintInfo(const StatInfo* info)
// info가 가리키는 주소의 값을 변경하지 못함
// info->hp = 1000; (불가)
void PrintInfo(StatInfo* const info)
// info가 가리키는 주소를 변경하지 못함
// info = &globalInfo (불가)
void PrintInfo(const StatInfo* const info)
// 둘 다 변경하지 못함
'C++ > 문법' 카테고리의 다른 글
C++ 객체 생성 (0) | 2021.11.11 |
---|---|
C++ 정적 바인딩 vs 동적 바인딩 (0) | 2021.11.11 |
C++ 깊은 복사 vs 얕은 복사 (0) | 2021.11.11 |
C++ static, extern (0) | 2021.11.09 |
컴파일 과정 (0) | 2021.11.09 |