10 분 소요

0. 포인터

  • 변수 또는 상수의 메모리 상의 주소저장하는 것이다.
  • 포인터는 변수 형태의 포인터상수(const) 형태의 포인터를 포괄하는 말이다.
  • C/C++ 에서는 시작 주소 값만을 가지고 위치를 표시한다. (Type에 따라 크기가 정해져 있기 때문에 시작 위치만 알아도 계산이 가능하다.)
  • 포인터 변수를 선언하고 초기화 않으면 어디의 주소를 가리키고 있는지 알 수 없다.
    int* ptr = nullptr;
    // nullpr == 0
    
  • 포인터 변수의 크기는 지정되어 있다.
    • x84(32bit) : 4 Byte
    • x64(64bit) : 8 Byte
크기가 지정되어 있으면 왜 타입을 설정해줘야 하는가?

❕ 포인터의 타입은 메모리 공간참조하는 기준이 된다.

  • 포인터 관련 연산자
    1) 주소 연산자 (`&`) : [type]*으로  변환, `주소값`을 가진다.  
    2) 산술 연산자 (`+, -`) : [type]의 크기만큼 이동한다.  
    3) 간접 연산자 (`*`) : 포인터 변수가 가리키는 곳의 값, *[변수이름]를 가진다.  
    4) 간접 멤버 연산자 (`->`) : *(간접연산자)와 .(구조체의 특정 멤버를 다룰 때 사용)을 합친 연산자이다.(struct, class에서 사용)  
    


1. 포인터 선언

// 선언 형식
[Type] * [변수 이름];
// ----------------------------
// 사용 예시
int num = 4;
int * num_ptr; // num_ptr → 주소를 저장하는 변수
num_ptr = # // &num → 의 주소 값
  • 어셈블리 언어
    image
  • 결과
    image

    0x0093FBE8 : num_ptr의 주소 값 (num의 주소 값을 저장하고 있다는 것을 알 수 있다.)
    0x0093FBF4 : num의 주소 값 (4를 저장하고 있다.)


2. 포인터 사용법

// 포인터가 가르키는 값 가져오기
* [변수이름]
// ----------------------------
// 사용 예시
int value = * num_ptr;
  • 어셈블리 언어
    image
  • 결과
    image
// 포인터가 가르키는 값 변경하기
// 사용예시
*num_ptr = 7;
// 
  • 어셈블리 언어
    image
  • 결과
    image


3. 포인터 타입

  • 포인터의 타입은 해당 주소에 대한 타입을 의미한다.
  • 포인터의 타입은 메모리 공간을 참조하는 기준이 된다.
// 예시 코드
short num = 0x11223344;
int* a_ptr = (int*)# // --> 1
*a_ptr = 0x33445566; // --> 2
  • 1) 결과
    image
  • 2) 결과
    image

    데이터가 할당된 메모리 영역 밖에 까지 침범한다.
    image


📑. 참고

카테고리:

업데이트:

댓글남기기