C++

포인터

왕건 2026. 3. 5. 21:00

기존에 배웠던 변수들과 다르게 포인터는 특정 정수를 가리키는 메모리 주소를 저장한다.

 

하나의 변수를 다른 변수에 대입하면 새로운 메모리 공간에 동일한 값이 복제된다.

따라서 복사 이후에 두 변수는 서로 독립적인 공간을 가지므로, 한 쪽 값을 변경해도 다른 쪽에는 영향이 없다.

 

하지만, 

A = B의 의미는 B에 있는 값을 A에 복사하는 것이므로 복사를 할때에는 복사 비용이 든다.

변수가 많아지고 크기가 커지면 복사 비용이 부담된다.

 

이러한 복사 비용을 줄이기위해 값을 직접 복사하는 방식 대신 변수의 주소를 가리켜서 동일한 데이터에 접근한다.

이것이 포인터다.


포인터의 모든 연산은 주소값과 관련이 있다.

 

1. 변수의 주소값을 담을 수 있다.

2. 담고 있는 주소값에 해당되는 메모리에 있는 값을 읽거나 수정할 수 있다.

 

A = B는 B값이 A로 저장된다는 의미이고

A = &B는 B의 주소값이 A에 들어간다는 의미이다.


하나의 방법은 값 전체를 복사하는 게 아니라, 변수의 시작 주소를 알려주는 것이다.

주소값은 고유하기 때문에, 이를 알고 있다면 실제 변수의 위치에 접근할 수 있다.

 

 

일반 변수라면 값인 4를 담았을 것이다. 하지만 포인터 변수는 값 대신 주소를 저장하므로 22를 담는다.


#include <iostream>
using namespace std;

int main() {
    int arr[3] = {10, 20, 30};
    int* p = arr; // 배열의 시작 주소를 포인터에 저장

    cout << "p가 가리키는 값: " << *p << endl;
    cout << "p+1이 가리키는 값: " << *(p + 1) << endl;
    cout << "p+2이 가리키는 값: " << *(p + 2) << endl;

    return 0;
}

/*
출력 결과:
p가 가리키는 값: 10
p+1이 가리키는 값: 20
p+2이 가리키는 값: 30
*/

 

포인터에 타입이 있는 이유!

 

p에 arr의 시작 주소를 담았는데 arr는 int형으로 선언 하였기 때문에 

+ 1을 하면 주소가 4바이트 만큼 증가한다.

 

즉 주소가 얼만큼 증가하고 빠지는지 결정하는 기준 요소가 된다.

 

포인터의 선언구조


포인터 배열과 배열 포인터

 

 

-포인터 배열은 포인터를 원소로 갖는 배열이다.

 

예) 크기가 4이고 각 원소가 int* 인 배열

 

int* ptrArr[4];

 


-배열 포인터는 배열 전체를 가리키는 포인터

즉 단일 변수가 아닌 배열 통째로를 가리키는 변수

 

2차원 배열에서 각 배열 통째로 건너 뛸때 사용한다.

 


포인터 연산

 

포인터의 타입에 따라, 해당 타입 변수의 크기만큼 담고 있는 주소를 증가시킨다.

ptr + 1

ptr에 주소값이 들어있으니까 주소값에 +1, 즉 자료형인 int크기만큼 이동한 자리에 주소값을 출력


(*ptr) + 1

ptr주소값에 들어있는 에 +1을 반환 후 출력
*단 원본 값은 바뀌지 않고, 단지 원본 값에 +1된 값이 반환된다.*


*(ptr + 1) == ptr[1] 둘은 동일하다.

 

ptr에는 주소값이 들어있기때문에 +1을 하면 선언된 int자료형만큼 이동을 하게되고,
*로 그 자리의 값을 불러왔기 때문에, 7의 다음 주소에 들어있는 3을 출력한다. 

'C++' 카테고리의 다른 글

기본 생성자와 오버로딩  (0) 2026.03.12
생성자와 소멸자  (0) 2026.03.12
C++로 전직 시스템과 전투 시스템 구현해보기  (0) 2026.03.10
Class  (0) 2026.03.09
C++로 인터페이스 상태창 구현해보기  (0) 2026.03.04