새소식

인기 검색어

게임 개발/언리얼 강의 (클라-서버)

[언리얼 MMORPG pt1] 포인터

  • -

포인터 기초

#include <iostream>
using namespace std;

// 오늘의 주제: 포인터

void SetHP(int* hp)
{
	*hp = 100;
}


int main()
{
	int number = 1;

	int hp = 1;
	SetHP(&hp); // 포인터로 주소를 넘겨줘야 값을 변경가능

	// TYPE* 변수명;
	// 일단 2가지 요소
	// - TYPE
	// - *

	// 바구니는 바구니인데...
	// [주소를 저장하는 바구니다!]
	// 참고) 포인터라는 바구니는 4바이트(32비트) 또는 8바이트(64비트) 크기 고정이다.
	int* ptr = &number;

	// 근데 남의 주소를 갖고 뭘 하라는거지?
	// 추가 문법: [주소를 저장하는 바구니]가 가리키는 주소로 가서 무엇인가를 해라!
	// *변수이름 = 값;
	// *이 붙으면 포탈을 타고 순간이동 한다고 생각해보자.
	// *이 여러번 등장하니 헷갈리는데, 사용 시점에 따라서 구분해서 기억하자.
	// - 변수 선언(주소를 저장하는 바구니다!)
	// - 사용할 때 (포탈 타고 순간이동)

	int value1 = *ptr;
	*ptr = 2;

	// TYPE은 왜 붙여줄까?
	// * => 포인터의 의미 => 주소를 저장하는 바구니 => 4 or 8바이트 고정 크기

	// 주소에 가면 뭐가 있는데?
	// ex) 결혼식 청첩장에 있는 주소 = 예식장 주소
	// ex) 명함에 있는 주소 = 회사 주소

	// 타입의 불일치
	__int64* ptr2 = (__int64*)&number;
	*ptr2 = 0x0000AABBCCDDEEFF; // 메모리 영역 8바이트를 덮어씌움(4바이트 침범)

	return 0;
}

포인터 연산

#include <iostream>
using namespace std;

// 오늘의 주제: 포인터 연산

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


struct Player
{
	int hp;
	int damage;
};

int main()
{
	int number = 1;

	// 1) 주소 연산자 (&)
	int* pointer = &number;

	// 2) 산술 연산자(+, -, ++, --)
	number = number + 1;
	number++;
	++number;
	number += 1; // 1 증가.

	pointer = pointer + 1;
	pointer++;
	++pointer;
	pointer += 1; // 0x00f7f808 -> 0x00f7f80c (4바이트) => 4 증가

	// int*
	// - * : 포인터 타입이네! (8바이트) 주소를 담는 바구니
	// - int : 주소를 따라가면 int(4바이트 정수형 바구니)가 있다.
	// [!] 포인터에서 +나 -등 산술 연산으로 1을 더하거나 빼면,
	// 정말 '그 숫자'를 더하고 빼라는게 아니라
	// 다음/이전 바구니로 이동하고 싶다. << [바구니 단위]의 이동으로
	// 즉, 1을 더하면 = 바구니 1개 이동시켜라
	// 3을 더하면 = 바구니 3개 이동시켜라

	pointer += 2; // 0x00f7f808 -> 0x00f7f810 (8바이트) => 8 증가

	// 3) 간접 연산자 (*)
	// - 포탈을 타고 해당 주소로 이동해서 값을 가져오거나 변경한다.

	// 4) 간접 멤버 연산자 (->)
	// - 포탈을 타고 해당 주소로 이동해서 멤버를 가져오거나 변경한다.
	// *. 을 한번에 ->로 바꿔쓸 수 있다.
	Player player;
	player.hp = 100;
	player.damage = 10;

	Player* playerPtr = &player;

	(*playerPtr).hp = 100;
	(*playerPtr).damage = 10;

	playerPtr->hp = 100;
	playerPtr->damage = 10;


	return 0;
}

참조 기초

반쯤 스킵

#include <iostream>
using namespace std;

// 오늘의 주제: 참조
// 로우레벨(어셈블리) 관점에서 실제 작동 방식은 포인터와 똑같음

struct StatInfo
{
	int hp;
	int attack;
	int defence;
};

void CreateMonster(StatInfo& stat)
{
	stat.hp = 100;
	stat.attack = 8;
	stat.defence = 2;
}

int main()
{
	StatInfo stat;
	CreateMonster(stat);
	return 0;
}
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.