포인터 실습

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 

 


 

복사 version  -   void EnterLobby에서 CreatePlayer() 처리과정

 

void EnterLobby()
{
	StatInfo player;
    player.hp = 0xbbbbbbbb;
    player.attack = 0xbbbbbbbb;
    player.defence = 0xbbbbbbbb;
	
    player = CreatePlayer();
}
StatInfo CreatePlayer()
{
    StatInfo ret;

    cout << "플레이어 생성" << endl;

    ret.hp = 100;
    ret.attack = 10;
    ret.defence = 2;

    return ret;
}

 

player = CreatePlayer();  처리과정

 

1.  [매개변수][RET][지역변수(temp(c,c,c), player(b,b,b))]

  • 컴파일러가 임의로 만든 지역변수 temp에 임의의 값(쓰레기값)이 담긴다.
    • temp는 스택의 지역변수(=로컬변수)다.
  • player의 값 (0xbbbbbbbb, 0xbbbbbbbb, 0xbbbbbbbb)

 

2.  [매개변수(&temp)][RET][지역변수(ret(100, 10, 2))] 

  • &temp로 temp변수를 매개변수로 받는다.
  • StatInfo CreatePlayer()로 지역변수 ret를 리턴한다.


3.  [매개변수][RET][지역변수(temp(100, 10, 2), player(100, 10, 2))]

  • 리턴 받은 지역변수를 지역변수 temp에 담는다.

 

4.  [매개변수(&temp)][RET][지역변수(ret(100, 10, 2))] 

  • CreatePlayer()에서 연산한 결과물을 &temp로 받아온다.
  • player에 &temp를 넣어준다.
       

스택의 지역변수 temp에서 연산한 후에 player에 담아주는 원리이다. 

중간단계를 걸쳐서 연산한다.

 


 

 

 포인터로 넘기는 version  -   void EnterLobby에서 CreateMonster() 처리과정

 

void EnterLobby()
{   
    StatInfo monster;
    //초기값 세팅
    monster.hp = 0xbbbbbbbb;
    monster.attack = 0xbbbbbbbb;
    monster.defence = 0xbbbbbbbb;

    CreateMonster(&monster);
}
void CreateMonster(StatInfo* info)
{
    cout << "몬스터 생성" << endl;

	//원본에 접근하여 작업한다.
    info->hp = 40;
    info->attack = 8;
    info->defence = 1;
}

 

CreateMonster();  처리과정


1.  [매개변수][RET][지역변수(monster(b,b,b))]

  • monster의 값 (0xbbbbbbbb, 0xbbbbbbbb, 0xbbbbbbbb)

 

2.  [매개변수(&monster)][RET][지역변수())] 

  • CreateMonster()
     

3.  [매개변수][RET][지역변수(monster(40, 8, 1))]

  • CreateMonster()에서 monster의 값을 넣은 후 리턴한다

 

4.  [매개변수(&monster)][RET][지역변수())] 

  • 매개변수로 받은 monster의 값을 넣어준다.

 

포인터를 넘겨주는 방식으로 연산.

실제 원본을 대상으로 작업을 한다. 작업 속도가 빠르다.

중간단계 temp를 걸치지 않고 바로 연산한다.


 

 

 

 

코드

 

더보기
#include <iostream>
using namespace std;

struct StatInfo
{
    int hp;  // +0
    int attack;  // +4
    int defence;  // +8
};

void EnterLobby();
StatInfo CreatePlayer();
void CreateMonster(StatInfo* info);
bool StartBattle(StatInfo* player, StatInfo* monster);

int main()
{
    EnterLobby();
    
    return 0;
}

void EnterLobby()
{
    cout << "로비에 입장했습니다" << endl;

    StatInfo player;
    //초기값 세팅
    player.hp = 0xbbbbbbbb;
    player.attack = 0xbbbbbbbb;
    player.defence = 0xbbbbbbbb;

    // [매개변수][RET][지역변수(temp(c,c,c), player(b,b,b))] [매개변수(&temp)][RET][지역변수(ret(100, 10, 2))] 
    // [매개변수][RET][지역변수(temp(100, 10, 2), player(100, 10, 2))] [매개변수(&temp)][RET][지역변수(ret(100, 10, 2))] 
    player = CreatePlayer();

    StatInfo monster;
    //초기값 세팅
    monster.hp = 0xbbbbbbbb;
    monster.attack = 0xbbbbbbbb;
    monster.defence = 0xbbbbbbbb;

    // [매개변수][RET][지역변수(monster(b,b,b))] [매개변수(&monster)][RET][지역변수())] 
    // [매개변수][RET][지역변수(monster(40, 8, 1))] [매개변수(&monster)][RET][지역변수())] 
    CreateMonster(&monster);

    // 번외편1)
    // 구조체끼리 복사할 때 무슨일이 벌어질까?
    // player = monster; 
    // 위에 한줄을 실행에 아래의 과정이 들어간다. 한줄이어도 빠르지않다. 이런 코드 조심해야한다.
    // player.hp = monster.hp
    // player.attack = monster.attack
    // player.defence = monster.defence

    bool victory = StartBattle(&player, &monster);

    if (victory)
        cout << "승리!" << endl;
    else
        cout << "패배!" << endl;
}

StatInfo CreatePlayer()
{
    StatInfo ret;

    cout << "플레이어 생성" << endl;

    ret.hp = 100;
    ret.attack = 10;
    ret.defence = 2;

    return ret;
}

void CreateMonster(StatInfo* info)
{
    cout << "몬스터 생성" << endl;

    info->hp = 40;
    info->attack = 8;
    info->defence = 1;
}

bool StartBattle(StatInfo* player, StatInfo* monster)
{
    while (true)
    {
        int damage = player->attack - monster->defence;
        if (damage < 0)
            damage = 0;
        
        monster->hp -= damage;
        if (monster->hp < 0)
            monster->hp = 0;
        cout << "몬스터 HP : " << monster->hp << endl;

        if (monster->hp == 0)
            return true;

        damage = monster->attack - player->defence;
        if (damage < 0)
            damage = 0;

        player->hp -= damage;
        if (player->hp < 0)
            player->hp = 0;
        cout << "플레이어 HP : " << player->hp << endl;

        if (player->hp == 0)
            return false;
    }
}

 

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
using namespace std;
 
// 포인터 실습
 
struct StatInfo
{
    int hp;  // +0
    int attack;  // +4
    int defence;  // +8
};
 
void EnterLobby();
StatInfo CreatePlayer();
void CreateMonster(StatInfo* info);
bool StartBattle(StatInfo* player, StatInfo* monster);
 
int main()
{
    EnterLobby();
    
    return 0;
}
 
void EnterLobby()
{
    cout << "로비에 입장했습니다" << endl;
 
    StatInfo player;
    player.hp = 0xbbbbbbbb;
    player.attack = 0xbbbbbbbb;
    player.defence = 0xbbbbbbbb;
 
    // [매개변수][RET][지역변수(temp(c,c,c), player(b,b,b))] [매개변수(&temp)][RET][지역변수(ret(100, 10, 2))] 
    // [매개변수][RET][지역변수(temp(100, 10, 2), player(100, 10, 2))] [매개변수(&temp)][RET][지역변수(ret(100, 10, 2))] 
    player = CreatePlayer();
 
    StatInfo monster;
    monster.hp = 0xbbbbbbbb;
    monster.attack = 0xbbbbbbbb;
    monster.defence = 0xbbbbbbbb;
 
    // [매개변수][RET][지역변수(monster(b,b,b))] [매개변수(&monster)][RET][지역변수())] 
    // [매개변수][RET][지역변수(monster(40, 8, 1))] [매개변수(&monster)][RET][지역변수())] 
    CreateMonster(&monster);
 
    // 번외편1)
    // 구조체끼리 복사할 때 무슨일이 벌어질까?
    // player = monster; 
    // 위에 한줄을 실행에 아래의 과정이 들어간다. 한줄이어도 빠르지않다. 이런 코드 조심해야한다.
    // player.hp = monster.hp
    // player.attack = monster.attack
    // player.defence = monster.defence
 
    bool victory = StartBattle(&player, &monster);
 
    if (victory)
        cout << "승리!" << endl;
    else
        cout << "패배!" << endl;
}
 
StatInfo CreatePlayer()
{
    StatInfo ret;
 
    cout << "플레이어 생성" << endl;
 
    ret.hp = 100;
    ret.attack = 10;
    ret.defence = 2;
 
    return ret;
}
 
void CreateMonster(StatInfo* info)
{
    cout << "몬스터 생성" << endl;
 
    info->hp = 40;
    info->attack = 8;
    info->defence = 1;
}
 
bool StartBattle(StatInfo* player, StatInfo* monster)
{
    while (true)
    {
        int damage = player->attack - monster->defence;
        if (damage < 0)
            damage = 0;
        
        monster->hp -= damage;
        if (monster->hp < 0)
            monster->hp = 0;
        cout << "몬스터 HP : " << monster->hp << endl;
 
        if (monster->hp == 0)
            return true;
 
        damage = monster->attack - player->defence;
        if (damage < 0)
            damage = 0;
 
        player->hp -= damage;
        if (player->hp < 0)
            player->hp = 0;
        cout << "플레이어 HP : " << player->hp << endl;
 
        if (player->hp == 0)
            return false;
    }
}
 
cs

'⭐ Programming > C++' 카테고리의 다른 글

[C++] 포인터 vs 참조, const  (0) 2022.03.26
[C++] 참조 기초  (0) 2022.03.26
[C++] 포인터 연산  (0) 2022.03.25
[C++] 포인터 #2  (0) 2022.03.25
[C++] 포인터 #1  (0) 2022.03.24