UE5 부트캠프(TIL)

[TIL] (c++) 포인터 개념

Yellow Kirin 2025. 5. 28. 19:54

포인터란?

 

포인터(pointer)란 변수의 메모리 주소를 저장하는 변수다.
즉, 값이 아니라 주소를 가리키는 변수라고 해할 수 있다.

 

int a = 10;
int* p = &a; // 변수 a의 주소를 포인터 p에 저장

포인터 선언 형식

자료형* 변수명;

//* 별의 정식 명칭은 에스터리스크(asterisk)
int* p;       // int형 데이터를 가리키는 포인터
double* dptr; // double형을 가리키는 포인터

 

  • * 기호는 "포인터 타입"을 나타낸다.
  • &는 "주소 연산자", 변수의 주소를 얻는다.

예제 코드

#include <iostream>
    using namespace std;
    
    int main() {
        int a = 10;
        int* p = &a; // 변수 a의 주소를 포인터 p에 저장
    
        cout << "변수 a의 값: " << a << endl;
        cout << "변수 a의 주소: " << &a << endl;
        cout << "포인터 p의 값(저장된 주소): " << p << endl;
    
        return 0;
    }
    
    /*
    출력 결과:
    변수 a의 값: 10
    변수 a의 주소: 0x61ff08 (주소는 실행할 때마다 다를 수 있음)
    포인터 p의 값(저장된 주소): 0x61ff08
    */

 


 

배열

배열은 이름을 가진 고정된 메모리 공간,
포인터는 주소를 저장하는 변수이다.

int arr[3] = {10, 20, 30};
int* ptr = arr;         // arr은 첫 요소의 주소 → ptr = &arr[0]

 

arr = ptr;     //  배열 이름은 상수, 대입 불가
ptr = arr;     //  포인터는 주소 복사 가능

 

sizeof 차이 예시

int arr[5];
int* ptr = arr;

cout << sizeof(arr) << endl;  // 5 * 4 = 20
cout << sizeof(ptr) << endl;  // 8 (64비트 시스템 기준)

 

예제코드 

#include <iostream>
    using namespace std;
    
    int main() {
        int arr[3] = {10, 20, 30};
        int* p = arr; // 배열의 시작 주소를 포인터에 저장
    
        cout << "p가 가리키는 값: " << *p << endl;
        cout << "p+1이 가리키는 값: " << *(p + 1) << endl;
        cout << "p+2이 가리키는 값: " << *(p + 2) << endl;
    
        return 0;
    }
    
    /*
    출력 결과:
    p가 가리키는 값: 10
    p+1이 가리키는 값: 20
    p+2이 가리키는 값: 30
    */

 


어디에  쓰는 가?

이쯤 되었으면 도대체 어디에 쓰는지 궁금할 수 있다.

  1. 변수의 주소를 직접 다루기 위해
  2. 함수에서 원본 데이터를 수정하려면 필수
  3. 동적 메모리 할당 (new/delete)
  4. 배열과 문자열은 본질적으로 포인터
  5. 구조체와 객체 접근 (-> 연산자)
  6. 함수를 가리킬 수 있다 (함수 포인터)
  7. 복잡한 자료구조 구현 (리스트, 트리 등)

생각 보다 다양한 곳에 쓰이고 있었다.

다음에는 레퍼런스의 개념을 알아 보겠다.