포인터 기초
#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;
}