[C++] 포인터 실습
포인터 실습
인프런 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 |
댓글
이 글 공유하기
다른 글
-
[C++] 포인터 vs 참조, const
[C++] 포인터 vs 참조, const
2022.03.26 -
[C++] 참조 기초
[C++] 참조 기초
2022.03.26 -
[C++] 포인터 연산
[C++] 포인터 연산
2022.03.25 -
[C++] 포인터 #2
[C++] 포인터 #2
2022.03.25