Language/C++

[C++] 포인터 실습

Return 2022. 6. 5. 12:11

Introduce 

 Struct(구조체)를 이용해 포인터를 사용했을때와 사용하지 않았을때의 차이점을 살펴본다. 

 

[구조체 선언]

#include <iostream>
using namespace std;

struct Statinfo
{
    int hp; // 4바이트 변수 3개 == 12바이트 짜리 구조체
    int attack;
    int defence;
};

[포인터를 사용하지 않은 경우]

Statinfo CreatePlayer()
{
    Statinfo ret;

    cout << "Player Created" << endl;
    ret.hp = 100;
    ret.attack = 10;
    ret.defence = 2;

    return ret;
}

int main()
{
    Statinfo player;
    player.hp = 0;
    player.attack = 0;
    player.defence = 0;
    
    player = CreatePlayer();
}

Statinfo 타입의 ret 지역변수를 하나 만들어서 return 해준다. 즉, 원본을 건드리지 않고, 복사를 해 건드린다. 

= 자세한 스택 프레임 구조 =

time 1 : [매개변수][RET][지역변수(temp, player(000))]  [매개변수(&temp)][RET][지역변수ret(100,10,2)]  ~

time 2 : [매개변수][RET][지역변수(temp(100,10,2), player(000))]  [매개변수(&temp)][RET][지역변수ret(100,10,2)]  ~

time 3 : [매개변수][RET][지역변수(temp(100,10,2), player(100,10,2))]  [매개변수(&temp)][RET][지역변 ret(100,10,2)] ~

 

즉, temp를 하나 만든 후 값을 채워놓고, 그 다음 temp의 내용을 player에 복사하는 방식 >> 생각보다 복잡하죠?

[포인터를 사용한 경우]

void CreateMonster(Statinfo *info)
{
    cout << "Monster Created" << endl;

    info->hp = 40;
    info->attack = 10;
    info->defence = 2;
}

int main()
{
    Statinfo monster;
    monster.hp = 0;
    monster.attack = 0;
    monster.defence = 0;
    CreateMonster(&monster);
}

이제는 temp를 만들지 않고 바로 monster의 주소를 넘겨받아서 작업한다. 

= 자세한 스택 프레임 구조 =

time 1 : [매개변수][RET][지역변수(monster(000))]  [매개변수(&monster)][RET][지역변수]  ~

time 2 : [매개변수][RET][지역변수(monster(40,10,2))]  [매개변수(&monster)][RET][지역변수]  ~