게임프로그래밍/게임 프로그래머 입문 올인원

[게임 프로그래머 입문 올인원] 배열, 포인터 기초, 포인터 연산

shine94 2025. 1. 22. 23:01

* 해당 글은 게임 프로그래머 입문 올인원 강의를 보고 정리한 글입니다.

   강의_바로가기

 

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버

Rookiss | 어디부터 시작할지 막막한 게임 프로그래밍 입문자를 위한 All-In-One 커리큘럼입니다. C++, 자료구조/알고리즘, STL, 게임 수학, Windows API, 게임 서버 입문으로 이어지는 알찬 커리큘럼으로

www.inflearn.com

 

 

 

 

* 배열

   고정맵을 만들때 유용하게 사용

   2D 로그라이크만들 때 유용하게 사용

   ㄴ 1차원 배열과 2차원 배열은 메모리 구조상 같음

 

* 포인터

   주소값을 담는 변수

   ㄴ 32비트 - 4바이트

   ㄴ 64비트 - 8바이트

 

* 포인터의 타입

   가리키고 있는 값의 자료형이다

   (예) int* ptr = &a; → a는 int형이다

 

#include <istream>
using namespace std;

int AddHp(int hp, int value)
{
00B51780  push        ebp  
00B51781  mov         ebp,esp  
00B51783  sub         esp,0C0h  
00B51789  push        ebx  
00B5178A  push        esi  
00B5178B  push        edi  
00B5178C  mov         edi,ebp  
00B5178E  xor         ecx,ecx  
00B51790  mov         eax,0CCCCCCCCh  
00B51795  rep stos    dword ptr es:[edi]  
00B51797  mov         ecx,offset _3A3183C1_Main@cpp (0B5C066h)  
00B5179C  call        @__CheckForDebuggerJustMyCode@4 (0B51325h)  
00B517A1  nop  
	hp += value;
00B517A2  mov         eax,dword ptr [hp]  
00B517A5  add         eax,dword ptr [value]  
00B517A8  mov         dword ptr [hp],eax  
	return hp;
00B517AB  mov         eax,dword ptr [hp]  
}
00B517AE  pop         edi  
00B517AF  pop         esi  
00B517B0  pop         ebx  
00B517B1  add         esp,0C0h  
00B517B7  cmp         ebp,esp  
00B517B9  call        __RTC_CheckEsp (0B51244h)  
00B517BE  mov         esp,ebp  
00B517C0  pop         ebp  
00B517C1  ret  

//////////////////////////////////////////////////////////////////////////////

int main()
{
00B51890  push        ebp  
00B51891  mov         ebp,esp  
00B51893  sub         esp,0CCh  
00B51899  push        ebx  
00B5189A  push        esi  
00B5189B  push        edi  
00B5189C  lea         edi,[ebp-0Ch]  
00B5189F  mov         ecx,3  
00B518A4  mov         eax,0CCCCCCCCh  
00B518A9  rep stos    dword ptr es:[edi]  
00B518AB  mov         ecx,offset _3A3183C1_Main@cpp (0B5C066h)  
00B518B0  call        @__CheckForDebuggerJustMyCode@4 (0B51325h)  
00B518B5  nop  
	int hp = 100;
00B518B6  mov         dword ptr [hp],64h  

	hp = AddHp(hp, 10);
00B518BD  push        0Ah  
00B518BF  mov         eax,dword ptr [hp]  
00B518C2  push        eax  
00B518C3  call        AddHp (0B513C0h)  
00B518C8  add         esp,8  
00B518CB  mov         dword ptr [hp],eax  

	return 0;
00B518CE  xor         eax,eax  
}
00B518D0  pop         edi  
00B518D1  pop         esi  
00B518D2  pop         ebx  
00B518D3  add         esp,0CCh  
00B518D9  cmp         ebp,esp  
00B518DB  call        __RTC_CheckEsp (0B51244h)  
00B518E0  mov         esp,ebp  
00B518E2  pop         ebp  
00B518E3  ret

 

#include <istream>
using namespace std;

void AddHp(int* hp, int value)
{
00721780  push        ebp  
00721781  mov         ebp,esp  
00721783  sub         esp,0C0h  
00721789  push        ebx  
0072178A  push        esi  
0072178B  push        edi  
0072178C  mov         edi,ebp  
0072178E  xor         ecx,ecx  
00721790  mov         eax,0CCCCCCCCh  
00721795  rep stos    dword ptr es:[edi]  
00721797  mov         ecx,offset _3A3183C1_Main@cpp (072C066h)  
0072179C  call        @__CheckForDebuggerJustMyCode@4 (0721325h)  
007217A1  nop  
	*hp += value;
007217A2  mov         eax,dword ptr [hp]  
007217A5  mov         ecx,dword ptr [eax]  
007217A7  add         ecx,dword ptr [value]  
007217AA  mov         edx,dword ptr [hp]  
007217AD  mov         dword ptr [edx],ecx  
}
007217AF  pop         edi  
007217B0  pop         esi  
007217B1  pop         ebx  
007217B2  add         esp,0C0h  
007217B8  cmp         ebp,esp  
007217BA  call        __RTC_CheckEsp (0721244h)  
007217BF  mov         esp,ebp  
007217C1  pop         ebp  
007217C2  ret 

////////////////////////////////////////////////////////////////////////////////////

int main()
{
00721F20  push        ebp  
00721F21  mov         ebp,esp  
00721F23  sub         esp,0D0h  
00721F29  push        ebx  
00721F2A  push        esi  
00721F2B  push        edi  
00721F2C  lea         edi,[ebp-10h]  
00721F2F  mov         ecx,4  
00721F34  mov         eax,0CCCCCCCCh  
00721F39  rep stos    dword ptr es:[edi]  
00721F3B  mov         eax,dword ptr [__security_cookie (072A040h)]  
00721F40  xor         eax,ebp  
00721F42  mov         dword ptr [ebp-4],eax  
00721F45  mov         ecx,offset _3A3183C1_Main@cpp (072C066h)  
00721F4A  call        @__CheckForDebuggerJustMyCode@4 (0721325h)  
00721F4F  nop  
	int hp = 100;
00721F50  mov         dword ptr [hp],64h  

	AddHp(&hp, 10);
00721F57  push        0Ah  
00721F59  lea         eax,[hp]  
00721F5C  push        eax  
00721F5D  call        AddHp (07213C5h)  
00721F62  add         esp,8  

	return 0;
00721F65  xor         eax,eax  
}
00721F67  push        edx  
00721F68  mov         ecx,ebp  
00721F6A  push        eax  
00721F6B  lea         edx,ds:[721F98h]  
00721F71  call        @_RTC_CheckStackVars@8 (07211E0h)  
00721F76  pop         eax  
00721F77  pop         edx  
00721F78  pop         edi  
00721F79  pop         esi  
00721F7A  pop         ebx  
00721F7B  mov         ecx,dword ptr [ebp-4]  
00721F7E  xor         ecx,ebp  
00721F80  call        @__security_check_cookie@4 (072114Ah)  
00721F85  add         esp,0D0h  
00721F8B  cmp         ebp,esp  
00721F8D  call        __RTC_CheckEsp (0721244h)  
00721F92  mov         esp,ebp  
00721F94  pop         ebp  
00721F95  ret

 

* hp 포인터, value 값

   007217A2  mov         eax,dword ptr [hp]        : eax에 main의 hp의 주소값 저장(0x00cffac0)

   007217A5  mov         ecx,dword ptr [eax]       : ecx에 eax 주소 안의 값(100) 저장

   007217A7  add          ecx,dword ptr [value]    : ecx에 value의 값(10) 더해서 저장(총 110)

   007217AA  mov         edx,dword ptr [hp]        : edx에 main의 hp의 주소값 저장(0x00cffac0)

   007217AD  mov         dword ptr [edx],ecx       : main의 hp에 ecx의 값(110) 저장

 

* 이중 포인터

   주소 값주소 값을 담는 변수

   가리키고 있는 값주소 값주소 값을 저장

 

* 포인터 연산

   32비트 - 4바이트 간격으로 연산됨

   64비트 - 8바이트 간격으로 연산됨

   ㄴ 주소 연산자 : &

   ㄴ 산술 연산자 : +, -

   ㄴ 간접 연산자 : *

   ㄴ 간접 멤버 연산자 : ->