본문 바로가기
C++/C++ 문법

C++ 포인터(메모리 주소를 저장하는 변수)와 배열

by Sein_ 2025. 10. 13.
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