포인터 / 배열 / 동적 할당 / vector

윤이령·2026년 4월 16일

사용 이유

  • 원본 데이터를 직접 바꾸려고
  • 배열은 함수에 넘기면 자동으로 포인터로 바뀜
  • 복사 비용 줄이려고
  • 동적 메모리 사용하려고
  • 자료구조 만들 때

선언 & 초기화

  • 주소 연산자 (&) : 변수의 시작 메모리 주소를 읽어옴
  • 역참조 연산자 (*) : 포인터가 가르키는 주소의 값을 읽음
  • 포인트 연산은 자료형 크기만큼 증가
자료형 *(포인터_변수_이름);
  • ptr = ptr + 1; => (*ptr)++ : ptr이 가르킨 곳의 값을 1 증가
int *ptr;
ptr = ∑
//한줄로
int *ptr = ∑

배열

  • 배열명 arr = 배열의 시작 주소 = 첫 원소의 시작주소 &arr[0] = arr + 0
  • (arr + 0), arr = arr[0]
  • *(arr + 1) : arr[1]
  • (arr + i) = arr[i] : 없으면 주소
  • (arr + i) = arr[i] : 있으면 값

동적 할당

  • new - delete : 한쌍 -> 메모리 누수 위험 있음
  • p : 0번째 배열 주소
  • *(p + n) : n번째 배열 값
int *p = new int[n];
for int i = 0; i < n; i++){
	cin >> p[i]; //배열
    cin >> *(p + i); // 포인터
    a[i] = i;
    *(a + i) = i;
}
delete []p;

vector 사용

  • vector는 자동 new/delete 해주는 배열
  • vector는 내부적으로 동적 메모리를 사용하고, 그걸 자동으로 관리해주는 배열 형태의 객체
#include <vector>
using namespace std;

vector<int> v = {1,2,3};
v.push_back(4);

참조(&) 방식

  • 문법이 그냥 변수처럼 자연스러움
  • *, -> 필요 없음
  • null 불가능 (안전)
//전달
void func(vector<int>& v) {
    v.push_back(10);
}
//호출
vector<int> v;
func(v);

포인터(*) 방식

  • 주소 넘겨야 함 (&v)
  • 사용할 때 -> 써야 함
  • null 가능 (위험)
//전달
//void func(vector<int> v) : 값 복사
void func(vector<int>* v) { // 원본 사용
    v->push_back(10);
}
//호출
vector<int> v;
func(&v);

& 역할
&a 주소를 가져옴
int& a 참조(별명) 선언

헷갈리는 부분 예시

  • 배열 -> 원본 변경
//arr[] == int* arr
//주소 전달 → 원본 바뀜
#include <iostream>
using namespace std;

void change(int arr[], int size) {
    arr[0] = 100;  // 원본 변경
}

int main() {
    int arr[3] = {1, 2, 3};
    change(arr, 3);
    cout << arr[0];  // 100
}
  • 배열 → 복사해서 사용
#include <iostream>
using namespace std;

void change(int arr[], int size) {
    arr[0] = 100;  // 복사본만 변경
}

int main() {
    int arr[3] = {1, 2, 3};

    int copy[3];
    for(int i = 0; i < 3; i++) {
        copy[i] = arr[i];
    }
    change(copy, 3);
    cout << arr[0];  // 1 (원본 유지)
}
  • vector → 원본 변경(참조 사용 &)
#include <iostream>
#include <vector>
using namespace std;

void change(vector<int>& v) {
    v[0] = 100;  // 원본 변경
}

int main() {
    vector<int> v = {1, 2, 3};
    change(v);
    cout << v[0];  // 100
}
  • vector → 복사
#include <iostream>
#include <vector>
using namespace std;

void change(vector<int> v) {
    v[0] = 100;  // 복사본만 변경
}

int main() {
    vector<int> v = {1, 2, 3};
    change(v);
    cout << v[0];  // 1
}

0개의 댓글