코가손의 블로그

C++ 포인터 & 참조 본문

C++/문법

C++ 포인터 & 참조

Cogason 2021. 11. 9. 15:12

 

▶ 포인터

더보기

선언

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 로 간단히 표현할 수 있다.

 

const 위치에 따른 수정 여부

 

 

▶ 참조

더보기
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
Comments