Pointer #2

Kimbab1004·2024년 2월 5일
0

CPP

목록 보기
2/27

출처 : https://programmerhumor.io/memes/pointers/

Python을 공부하다 C++을 공부하니 Python으로 다시 갈아타고 싶다는 생각이 들었다.
선행지식이 어느 정도 있는 상태에서 공부하니 그다지 어렵지는 않았지만 익숙하지 않은 경험이라 귀찮다는 생각이 들었다.

지난번 Pointer #1에서는 Pointer의 기초 지식에 대해 기록하였고 이번 Pointer #2에서는 포인터의 연산 기법에 대해 학습한 내용을 기록하고자 한다.

1) 주소 연산자 (&)
2) 산술 연산자 (+ -)
3) 간접 연산자 (*)
4) 간접 멤버 연산자 (->)

1) 주소 연산자

1) 주소 연산자를 이용해서 주소를 뽑아올 수 있었다.
해당 변수의 주소를 알려달라.

number라는 변수의 주소가 pointer에 들어간다.
더 정확히 말하면 해당 변수 타입(Type)에 따라서 Type*를 반환한다.

int number = 1;
int* pointer = &number;

2) 산술 연산자

number = number + 1;
number++; //1이 증가
++number;
number += number; 

이런 문법들이 포인터에도 가능하다.

[!] 포인터에서 +나 -등 산술 연산으로 1을 더하거나 빼면 정말 "그 숫자(1)"를 더하고 빼라는 의미가 아니다. 한번에 Type 크기만큼을 이동하라 라는 의미이다.

다음/이전 바구니로 이동하고 싶다. -> [바구니 단위]의 이동

1을 더하면 바구니 1개 만큼 로 이동하라
3을 더하면 바구니 3개 만큼 이동시켜라

pointer += 1;
pointer++;//4가 증가

3) 간접 연산자

그렇기에 포인터를 이용해 값을 변경하고 싶으면 간접 연산자를 이용해야 한다.

//해당 주소로 이동해서 값을 변경한다.
number = 3;
*pointer = 3;

Player player;
player.hp = 100;
player.attack = 10;

Player* playerPtr = &player;

(*playerPtr).hp = 200;
(*playerPtr).attack = 10;

4) 간접 멤버 연산자

간접 연산자를 이용하기 위해서는 과 .을 사용해야 한다. 이는 상당히 불편한데 간접 멤버 연산자는 -> 하나만으로 과 .을 퉁칠 수 있다.

// * 간접 연산자 (포탈 타고 해당 주소로 이동
// . 구조체의 특정 멤버를 다룰때 사용(어셈블리 언어로 까보면 .은 사실 덧셈) 어떤 구조체의 멤버가 몇번 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();
}

0개의 댓글