728x90
[Do it C++ 완전정복_ 98~112p]
포인터 기본
변수와 메모리 주소
- 프로그램에서 변수는 값을 저장하는 메모리 공간을 의미합니다.
- 변수는 이름을 통해 접근하지만, 실제로는 메모리의 주소를 갖습니다.
- 변수의 주소는 & 연산자를 사용하여 확인할 수 있습니다. (& → 변수의 주소를 반환)
int a = 10;
std::cout << &a; // 변수 a의 메모리 주소 출력
포인터 (pointer)
- 포인터는 메모리 주소를 저장하는 변수입니다.
- 타입* 포인터이름; → 포인터 변수를 선언
- *포인터명 → 간접 참조 연산자 * 를 통해 포인터가 가리키는 값을 읽거나 수정 가능합니다.
int* ptr; // int형 데이터를 가리키는 포인터
int a = 5;
ptr = &a; // a의 주소를 ptr에 저장
std::cout << *ptr; // 5 출력
*ptr = 20; // a의 값이 20으로 변경
포인터 변수 크기
- 포인터 변수의 크기는 가리키는 데이터 타입과 무관하고, 운영체제/플랫폼의 주소 크기에 따라 결정됩니다.
- 예를 들어, 64비트 시스템에서는 8바이트, 32비트 시스템에서는 4바이트
int* p;
double* q;
std::cout << sizeof(p) << " " << sizeof(q); // 둘 다 8 (64비트 시스템)
다중 포인터
- 포인터를 가리키는 포인터를 다중 포인터라고 합니다.
- 포인터(=주소)에 대한 정보가 저장된 주소(=포인터)
int a = 5;
int* p1 = &a; // int형 포인터
int** p2 = &p1; // 포인터 p1을 가리키는 포인터
std::cout << **p2; // 5 출력
배열과 포인터
배열
- 배열은 같은 타입의 데이터를 연속된 메모리 공간에 저장하는 자료 구조입니다.
- 배열 선언 → 타입 배열이름[크기];
- 배열 초기화 → 타입 배열이름[크기] = { 원소, ... };
배열의 메모리 구조
- 배열의 각 원소는 연속적인 메모리 주소에 위치하고 있습니다.
- 배열은 인덱스로 접근이 가능합니다. (ex. arr[i])
int arr[5]; // int형 원소 5개 배열 선언
// 메모리 구조 예시 _ (가정: int = 4바이트)
주소: 1000 1004 1008 1012 1016
값 : ??? ??? ??? ??? ???
배열과 포인터 연산
- 배열명(ex.ptr) 자체는 &ptr[0]와 같은 의미로, 첫 번째 원소의 주소로 취급됩니다. (ptr + 0 → 0번째 원소의 주소)
- 포인터에 정수를 더하면 그 타입 크기만큼 메모리 주소가 이동합니다.
- 즉, 포인터 산술을 통해 배열의 i번째 원소 주소를 구할 수 있습니다.
- ptr + i → i번째 원소의 주소
- *(ptr + i) → i번째 원소의 값
int* p = arr; // p = &arr[0]
arr[2] == *(arr + 2) == *(p + 2)
포인터 사용시 주의할 점
- 역참조 전에 반드시 유효한 메모리를 가리키는지 확인
- 할당된 메모리 범위를 벗어난 접근 금지
- 해제된 메모리에 접근 금지
'C++ > C++ 문법' 카테고리의 다른 글
| C++ 정적 변수(static), 상수 변수(const) (0) | 2025.10.13 |
|---|---|
| C++ 함수와 매개변수 (0) | 2025.10.13 |
| C++ 연산자와 연산자 우선순위 (0) | 2025.10.13 |
| C++ 리터럴 (Literal) (0) | 2025.10.13 |
| C++ Lvalue와 RValue (0) | 2025.10.13 |