C++에서의 포인터 이해

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;

7. 주의 사항

- null 포인터 참조 시 프로그램 종료. - 메모리 해제 후 포인터를 null로 설정하여 오용 방지. - 배열 이름은 포인터와 유사하지만, 자체 변수가 아님. - 참조는 초기화 필수이며 재할당 불가, 포인터는 null 가능.

태그: C++ 메모리관리 포인터 참조 동적메모리

6월 30일 04:31에 게시됨