언리얼 - C++ 17 : ⭐ 포인터

김정환·2025년 3월 19일

Unreal C++

목록 보기
17/37

포인터 Pointer

  • 포인터 : 주소를 가리키는 기능
  • 포인터 변수 : 주소를 가리키는, 저장하는 변수
int* pInt = nullptr;
  • 자료형 + *
    • 자료형 해당 포인터에게 전달된 주소를 해석하는 단위.
    • *를 붙여서 자료형의 변수를 가리키는 주소값.

      해당 주소로 갔을 때, 자료형의 형태로 그 값을 해석한다

  • nullptr : null 주소, 아무것도 가리키지 않는다. (실제값 0)
int i = 100;
int* pInt = &i;
  • &i : 변수 i의 주소를 나타냄.
  • pInti의 주소를 저장하고 있다.

주소

메모리 공간에서 변수가 할당받은 위치.

  • 메모리를 할당받을 때, 저장되는 특정한 위치가 정해짐.
  • c++은 포인터를 지원해서 주소를 직접적으로 사용할 수 있게 함.

주소 접근

  • 주소 받기 &변수
    &변수 : 변수 앞에 &를 붙여 해당 변수의 주소값을 사용할 수 있음.
  • 주소값 사용 *변수
int i = 100;
int* pInt = &i;

(*pInt) = 500;
  • *포인터 변수 : 포인터 변수 앞에 *를 붙여서 해당 주소로 접근해서 값을 직접 수정할 수 있음.
  • 포인터 변수에 접근해서 데이터를 처리할 때, 정수 방식으로 처리할까, 실수 방식으로 처리할까?

주소 단위

  • 주소의 단위 : 1 Byte
  • 주소를 표현하는 방식은 정수 방식
    • 비트 단위로는 주소를 보유할 수 없단 소리
    • 예를 들어 100번 주소와 102번 주소 사이의 공간은? 2 byte 공간

⭐ 포인터 해석

int* pInt;
포인터 변수 선언 때 앞에 자료형을 앞에 적는 이유?

  • 컴퓨터는 주소 (위치)만 알고 있을 뿐
    그 위치에 어떤 값이 있는지, 얼마만큼의 공간을 써야하는지 알 수 없음.
  • 이런 일을 방지하기 위해서 포인터 변수 선언 시, 자료형을 같이 명시하는 것.
    • 자료형을 명시함으로써 해당 위치로 갔을 때,
      해당 자료형의 크기만큼의 데이터를 사용하는 것.
    • int* pInt; pInt의 위치로 가서 4 byte만큼의 공간에 있는 값을 가리키는 것.
  • 이는 곧, 주소가 가리킬 데이터의 타입을 정의했다고도 할 수 있음.

int i = 100;
int* pInt = &i;

float f = 3.f;

pInt = &f; 			// 이건 문법적으로 방어해줌 : 컴파일 에러
pInt = (int*)&f; 	// 명시적 형변환으로 억지로 넣을 순 있음.

int num = *pInt; // 이 값은?
  • int : 4 byte
    float : 4 byte
  • int*에 동일한 크기의 float 주소값을 강제로 넣은 상황
    • 이때 데이터의 처리는? *pInt
    • 부동소수점 실수표현 체계의 float 값 : 3.f
    • 실수값의 비트를 정수표현 체계로 해석해냄. : 1077936128
      • msb, 지수, 가수 표현하던 비트값을
        msb, 이진법 표현하는 방식으로 계산해버리는 것.

메모리 안에 있는 비트값을
어떤 방식으로 해석하는가에 따라 아예 다른 값이 되는 것.

  • 값이 바뀐게 아님
    값을 해석하는 방식에 따라 결과가 달라진 것
int* pInt = nullptr; // 이 위치로 가면 int로 해석할 것

char* pChar = nullptr; // 이 위치로 가면 char로 해석할 것
short* pShort = nullptr; // 이 위치로 가면 short으로 해석할 것
  • 그래서 다른 형태의 자료형을 포인터에 넣으려고 하면, 컴파일러가 문법적으로 방어하려는 것.
    • 의도와 달리 전혀 다르게 해석될 여지가 있으므로
profile
만성피로 개발자

0개의 댓글