C++에서 포인터는 메모리 주소를 저장하는 변수로, 다른 변수나 객체에 간접적으로 접근하고 조작할 수 있습니다.
1. 포인터의 개념
포인터는 특정 데이터의 메모리 주소를 저장하는 변수입니다. 자신의 메모리 주소도 존재하지만, 저장된 값은 다른 변수의 주소입니다.2. 포인터 선언 문법
타입 *변수명; // 예: int *ptr; double *p;
- 별표(*)의 위치는 타입과 변수명 사이에 있을 수 있으며, 두 경우 모두 동일한 의미입니다. 코드 스타일에 따라 일관성을 유지해야 합니다.
- 포인터의 타입은 해당 포인터가 참조할 수 있는 데이터 타입을 결정합니다 (예: int*는 int형 변수만 참조 가능).
3. 포인터 초기화 방법
포인터는 사용 전 반드시 초기화해야 하며, 초기화되지 않은 상태로 사용 시 야성 포인터로 인해 예측 불가능한 오류 발생 가능합니다.(1) 변수 주소 할당
int value = 10;
int *pointerVar = &value; // pointerVar이 value 변수를 참조
(2) 동적 메모리 할당
int *dynamicPtr = new int(20); // 20으로 초기화된 메모리 할당
delete dynamicPtr; // 사용 완료 후 메모리 해제
(3) 다른 포인터 복사
int value = 10;
int *firstPtr = &value;
int *secondPtr = firstPtr; // secondPtr도 value를 참조
(4) null 포인터 설정
int *nullPtr = nullptr; // C++11 이후 권장 방식
4. 포인터 대입 규칙
- 동일한 타입 포인터 간에는 직접 대입 가능:
int value = 10;
int *ptr1 = &value;
int *ptr2 = ptr1; // ptr2도 value를 참조
- 다른 타입 포인터 간 직접 대입 불가 (강제 형변환 필요):
int value = 10;
double *invalidPtr = &value; // 타입 불일치로 컴파일 오류
- 정수값을 포인터에 직접 대입 불가 (특수 상황 제외):
int *badPtr = 100; // 잘못된 형변환으로 컴파일 오류
- void 포인터 사용 시:
int value = 10;
void *genericPtr = &value; // 유효한 주소 할당
int *castedPtr = static_cast(genericPtr); // 형변환 후 사용
5. 주요 연산
- **참조 접근**:
int value = 10;
int *ptr = &value;
cout << *ptr; // 10 출력
*ptr = 20; // value 값을 20으로 변경
- **배열 포인터 이동**:
int array[5] = {1,2,3,4,5};
int *arrPtr = array; // 배열 첫 번째 요소 참조
arrPtr++; // 다음 요소로 이동
cout << *arrPtr; // 2 출력
- **주소 비교**: 배열 순회 등에 활용 가능.
6. 주요 포인터 유형
- **상수 포인터**:
int value = 10, otherValue = 20;
int *const fixedPtr = &value; // 포인터 자체는 변경 불가
*fixedPtr = 30; // value 값 변경 가능
- **상수 참조 포인터**:
const int constantValue = 10;
const int *readOnlyPtr = &constantValue; // 값 변경 불가
readOnlyPtr = &otherValue; // 다른 상수 변수 참조 가능
- **상수 상수 포인터**:
const int constantValue = 10;
const int *const unchangeablePtr = &constantValue;