포인터 공부, Pointer
C++ 포인터
오늘은 포인터 공부를 한 내용을 정리 해볼려고 한다. 이번 포인터 공부는 The Cherno라는 Youtuber의 채널을 통해 하였다. 이분은 호주에서 개발자로 살고 계신 분 같은데 유익한 비디오를 많이 포스팅 하셨다.
YouTube 원문: www.youtube.com/watch?v=DTxHyVn0ODg
프로그램을 작성하는데 있어서 메모리를 이해 하는 것은 매우 중요하다. 만약 우리가 게임 어플리케이션을 작성하고 실행을 하게 되면 이 앱은 컴퓨터 메모리의 로딩이 된다.
우리가 작성한 모든 코드들은 메모리의 로딩이 되며, 컴퓨터의 CPU가 메모리상에 로딩된 커맨드들을 액세스 하고 실행을 하게 된다. 우리가 작성한 프로그램을 하드 디스크에 저장하고 실행을 하게 되면,
첫번째로 프로그램이 메모리로 로딩이 되고, CPU가 메모리상에 로딩된 커맨드들을 액세스를 하며 실행을 하는 구조이다.
이러한 메모리를 관리 하고 액세스를 할 수 있게 해주는 녀석이 바론 포인터이다. 포인터는 쉽게 integer 이다. 포인터는 컴퓨터 메모리의 주소를 저장하고 있는 integer 이다. 데이터 타입 (Data type) 과 상관없이 포인터는 메모리의 주소값을 가지고 있는 integer 이다. 데이터 타입은 프로그램을 작성할 때 엔지니어들에게 이 포인터는 몇 바이트인지만을 나타내 줄 뿐 포인터의 성질?을 바꿀 수 없다.. 포인터는 단지 메모리의 주소값을 가지고 있는 integer 이다.
심플한 포인터 하나를 정의 하였다. nullptr은 c++11 에서 새로 소개된 것으로 NULL 값을 가질 수 있는 곳에 사용 할 수 있다. NULL은 실질적으로 #define NULL 0 이다. 메모리 주소 0 는 유효하지 않은 값으로 프로그램을 실행 할 경우 에러가 난다. 아래 예제를 실행하게 되면 에러가 나지만 여전히 ptr은 포인터 이다.
#include <iostream>
int main()
{
void* ptr = nullptr;
std::cin.get();
}
이번엔 실질적으로 int 타입의 변수를 생성하고 메모리 주소값을 반환하는 예제를 보겠다.
#include <iostream>
int main()
{
int var = 8;
void* ptr = &var;
std::cout << ptr << std::endl;
std::cin.get();
}
위 예제를 실행 하게 되면 var 변수의 메모리 주소 값 0x0077FBEC 출력이 되는것을 알 수 있다. 보는것과 같이 16진수 형태의 숫자가 반환 되었으며 이것은 integer 이다. 여기서 & 앰퍼센드는 변수의 주소값을 반환할때 사용되는 키워드 이다. 0x0077FBEC var 변수의 메모리의 주소 값이며, 이 메모리 주소 안에 var 변수의 값이 저장되어져 있다.
Visual Studio 에서 Debug 모드로 코드를 실행 후 실질적으로 변수 var의 메모리 값을 확인 할 수 있다.
Breake point를 std::cout << ptr << std::endl; line 에 만든 후 디버깅 모드로 실행하자.
위 메뉴에서 Debug -> Windows -> Memory -> Memory 1을 실행
위에 보는것과 같이 var변수의 메모리 주소 값은 0x00cffe4c 이다. 메모리 창을 열고 메모리 주소 값을 입력을 하게 되면 실제 0x00cffe4c 메모리 주소를 확인 할 수 있다. 위에 보는 것과 같이 이 메모리 주소상에는 숫자 8이 저장되어져 있는 것을 확인 할 수 있다. ( int 타입은 4 bytes 이기 때문에 총 4개의 byte가 할당 되어진 것을 볼 수 있다. )
아래 예제는 double 타입의 포인터를 생성하고 var의 메모리 주소값을 저장 한다. 위에서 언급한것과 같이 포인터를 공부하는데 있어서 데이터 타입은 중요하지 않다. 데이터 타입은 몇바이트의 메모리 값을 할당 해야 하는지 CPU에게 알려줄 뿐이다.
#include <iostream>
int main()
{
int var = 8;
double* ptr = (double*)&var;
std::cout << ptr << std::endl;
std::cin.get();
}
위에 예제를 위와 같은 방법으로 실행을 하고 메모리 뷰에서 확인을 하면, 총 4 bytes의 메모리가 할당되어져 있고 value 8이 저장되어져 있는것을 확인 할 수 있다.