이 튜토리얼은 C++ 포인터의 작동 원리와 실전 예제로 이 필수 언어 기능을 마스터하도록 돕습니다.
C++에서 포인터는 다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터는 직접 메모리 조작, 동적 할당, 효율적 데이터 처리를 가능케 합니다.
C++에서 주소
변수 var가 주어지면 &var 표현식이 메모리 내 주소를 반환합니다. 예:
예제 1: C++에서 변수 주소 출력하기
#include <iostream> using namespace std; int main() { // 변수 선언 int var1 = 3; int var2 = 24; int var3 = 17; // var1 주소 출력 cout << "Address of var1: " << &var1 << endl; // var2 주소 출력 cout << "Address of var2: " << &var2 << endl; // var3 주소 출력 cout << "Address of var3: " << &var3 << endl; }
출력
Address of var1: 0x7fff5fbff8ac Address of var2: 0x7fff5fbff8a8 Address of var3: 0x7fff5fbff8a4
주소는 16진수 형식으로 표시됩니다. 연속된 주소 간 4바이트 차이는 64비트 시스템에서 int 크기가 4바이트임을 반영합니다.
참고: 정확한 주소는 프로그램 실행마다 달라질 수 있습니다.
C++ 포인터
보았듯 포인터는 직접 값이 아닌 주소를 저장합니다. 포인터 선언은 간단합니다:
int *pointVar;
여기서 pointVar는 int 타입 포인터입니다. 선호 문법은 별표를 타입 옆에 둡니다:
int* pointVar; // 선호 문법
다중 선언도 가능:
int* pointVar, p;
이 줄에서 pointVar는 포인터, p는 일반 int입니다. 별표는 타입이 아닌 변수 이름과 결합됩니다.
팁:* 연산자는 포인터 선언용이며 곱셈 수행용이 아닙니다.
포인터에 주소 할당하기
포인터를 변수 주소에 바인딩하려면 주소 연산자 & 사용:
int* pointVar, var; var = 5; // var 주소를 pointVar 포인터에 할당 pointVar = &var;
#include <iostream> using namespace std; int main() { int var = 5; // 포인터 변수 선언 int* pointVar; // var 주소 저장 pointVar = &var; // var 값 출력 cout << "var = " << var << endl; // var 주소 출력 cout << "Address of var (&var) = " << &var << endl << endl; // 포인터 pointVar 출력 cout << "pointVar = " << pointVar << endl; // pointVar가 가리키는 주소 내용 출력 cout << "Content of the address pointed to by pointVar (*pointVar) = " << *pointVar << endl; return 0; }
출력
var = 5 Address of var (&var) = 0x61ff08 pointVar = 0x61ff08 Content of the address pointed to by pointVar (*pointVar) = 5
포인터가 가리키는 값 변경하기
pointVar가 var를 가리키면 *pointVar 수정으로 원본 변수 변경:
int var = 5; int* pointVar; pointVar = &var; *pointVar = 1; cout << var << endl; // 출력: 1
pointVar와 &var가 같은 주소 보유하므로 역참조 값 변경 시 var 업데이트.
예제 3: 포인터로 값 변경하기
#include <iostream> using namespace std; int main() { int var = 5; int* pointVar; // var 주소 저장 pointVar = &var; // var 출력 cout << "var = " << var << endl; // *pointVar 출력 cout << "*pointVar = " << *pointVar << endl << endl; cout << "var 값을 7로 변경:" << endl; // var 값을 7로 변경 var = 7; // var 출력 cout << "var = " << var << endl; // *pointVar 출력 cout << "*pointVar = " << *pointVar << endl << endl; cout << "*pointVar 값을 16으로 변경:" << endl; // var 값을 16으로 변경 *pointVar = 16; // var 출력 cout << "var = " << var << endl; // *pointVar 출력 cout << "*pointVar = " << *pointVar << endl; return 0; }
출력
var = 5 *pointVar = 5 var 값을 7로 변경: var = 7 *pointVar = 7 *pointVar 값을 16으로 변경: var = 16 *pointVar = 16
포인터 작업 시 흔한 실수
아래는 전형적 오류와 올바른 포인터 처리법:
int var, *varPoint; // 잘못! varPoint는 주소지만 var은 아님 varPoint = var; // 잘못! // &var은 주소 // *varPoint는 &var에 저장된 값 *varPoint = &var; // 올바름! // varPoint는 주소고 &var도 주소 varPoint = &var; // 올바름! // *varPoint와 var 둘 다 값 *varPoint = var;