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
*/
어디에 쓰는 가?
이쯤 되었으면 도대체 어디에 쓰는지 궁금할 수 있다.
- 변수의 주소를 직접 다루기 위해
- 함수에서 원본 데이터를 수정하려면 필수
- 동적 메모리 할당 (new/delete)
- 배열과 문자열은 본질적으로 포인터
- 구조체와 객체 접근 (-> 연산자)
- 함수를 가리킬 수 있다 (함수 포인터)
- 복잡한 자료구조 구현 (리스트, 트리 등)
생각 보다 다양한 곳에 쓰이고 있었다.
다음에는 레퍼런스의 개념을 알아 보겠다.