출처 : https://programmerhumor.io/memes/pointers/
Python을 공부하다 C++을 공부하니 Python으로 다시 갈아타고 싶다는 생각이 들었다.
선행지식이 어느 정도 있는 상태에서 공부하니 그다지 어렵지는 않았지만 익숙하지 않은 경험이라 귀찮다는 생각이 들었다.
지난번 Pointer #1에서는 Pointer의 기초 지식에 대해 기록하였고 이번 Pointer #2에서는 포인터의 연산 기법에 대해 학습한 내용을 기록하고자 한다.
1) 주소 연산자 (&)
2) 산술 연산자 (+ -)
3) 간접 연산자 (*)
4) 간접 멤버 연산자 (->)
1) 주소 연산자를 이용해서 주소를 뽑아올 수 있었다.
해당 변수의 주소를 알려달라.
number라는 변수의 주소가 pointer에 들어간다.
더 정확히 말하면 해당 변수 타입(Type)에 따라서 Type*를 반환한다.
int number = 1;
int* pointer = &number;
number = number + 1;
number++; //1이 증가
++number;
number += number;
이런 문법들이 포인터에도 가능하다.
[!] 포인터에서 +나 -등 산술 연산으로 1을 더하거나 빼면 정말 "그 숫자(1)"를 더하고 빼라는 의미가 아니다. 한번에 Type 크기만큼을 이동하라 라는 의미이다.
다음/이전 바구니로 이동하고 싶다. -> [바구니 단위]의 이동
1을 더하면 바구니 1개 만큼 로 이동하라
3을 더하면 바구니 3개 만큼 이동시켜라
pointer += 1;
pointer++;//4가 증가
그렇기에 포인터를 이용해 값을 변경하고 싶으면 간접 연산자를 이용해야 한다.
//해당 주소로 이동해서 값을 변경한다.
number = 3;
*pointer = 3;
Player player;
player.hp = 100;
player.attack = 10;
Player* playerPtr = &player;
(*playerPtr).hp = 200;
(*playerPtr).attack = 10;
간접 연산자를 이용하기 위해서는 과 .을 사용해야 한다. 이는 상당히 불편한데 간접 멤버 연산자는 -> 하나만으로 과 .을 퉁칠 수 있다.
// * 간접 연산자 (포탈 타고 해당 주소로 이동
// . 구조체의 특정 멤버를 다룰때 사용(어셈블리 언어로 까보면 .은 사실 덧셈) 어떤 구조체의 멤버가 몇번 offset에 있는지
// ->는 *와 .을 한번에!
//(*playerPtr).hp = 200;
//(*playerPtr).attack = 10;
//같은 기능이다.
playerPtr->attack = 10;
playerPtr->hp = 100;
포인터를 배우기 전 vs 포인터를 배운 후
#include <iostream>
using namespace std;
struct Statinfo {
int hp; // + 0
int attack; // + 4
int defence; // + 8
};
//플레이어가 승리시 True 패배시 False
bool StartBattle(Statinfo* player, Statinfo* monster);
//포인터를 배우기 전
Statinfo CreatePlayer();
//포인터를 배운 후
void CreateMonster(Statinfo* info);
void EnterLobby() {
cout << "로비에 입장 했습니다.";
Statinfo player;
player = CreatePlayer();
Statinfo Monster;
CreateMonster(&Monster);
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;
cout << "플레이어 HP" << player->hp << endl;
player->hp -= damage;
if (player->hp < 0) {
player->hp = 0;
return false;
}
}
}
int main()
{
EnterLobby();
}