C++는 두 가지 포인터 연산자를 제공합니다. 바로 주소 연산자(Address of Operator, &)와 간접 참조 연산자(Indirection Operator, *)입니다.
포인터(pointer)란 다른 변수의 주소값을 저장하는 변수를 말합니다. 즉, 어떤 변수가 다른 변수의 메모리 주소를 담고 있을 때, 그 변수가 다른 변수를 '가리킨다(point to)'고 표현합니다. 포인터가 가리키는 대상은 int나 char 같은 기본 자료형은 물론, 객체, 구조체, 심지어 또 다른 포인터까지 어떤 데이터 타입이든 될 수 있습니다.
주소 연산자(&)란?
주소 연산자(&)는 간접 참조 연산자(*)의 반대 역할을 하는 단항(unary) 연산자입니다. 피연산자로 지정된 변수의 메모리 주소(r-value)를 반환합니다. 쉽게 말해, 변수 이름 앞에 &를 붙이면 그 변수가 저장된 메모리상의 위치(주소)를 얻을 수 있습니다.
예제 코드
#include <iostream>
using namespace std;
int main () {
int var;
int *ptr;
int val;
var = 3000;
ptr = &var; // var의 주소를 가져와 ptr에 저장
val = *ptr; // ptr이 가리키는 주소에 있는 값을 가져옴
cout << "Value of var :" << var << endl;
cout << "Value of ptr :" << ptr << endl;
cout << "Value of val :" << val << endl;
return 0;
}실행 결과
위 코드를 컴파일하고 실행하면 다음과 같은 결과가 출력됩니다.
Value of var : 3000 Value of ptr : 0xbff64494 Value of val : 3000
코드 설명
위 예제의 동작 과정을 살펴보면 다음과 같습니다.
1. ptr = &var; — 주소 연산자(&)를 사용해 변수 var의 메모리 주소를 구한 뒤, 포인터 변수 ptr에 저장합니다. 이 시점부터 ptr은 var를 가리킵니다.
2. val = *ptr; — 간접 참조 연산자(*)를 사용해 ptr이 가리키는 주소에 저장된 값, 즉 var의 값인 3000을 읽어와 val에 대입합니다.
출력 결과에서 볼 수 있듯이, var와 val은 동일한 값 3000을 가지며, ptr에는 16진수 형태의 메모리 주소(예: 0xbff64494)가 저장됩니다. 이처럼 &와 *는 서로 반대 방향의 연산을 수행하는 짝이 되는 연산자이며, C++에서 포인터를 다루는 핵심 도구입니다.