C/C++을 처음 접하면 가장 많이 혼란스러워하는 개념 중 하나가 포인터(pointer)다. 포인터는 단순히 "주소를 저장하는 변수"이지만, 여기에 & 연산자(주소 연산자)와 * 연산자(역참조 연산자)가 등장하면서 초보자에게는 헷갈리는 지점이 많다.
int a = 10;
int* p = &a; // p는 a의 주소를 저장
C/C++에서 변수를 선언하면, 해당 변수는 메모리 상의 어떤 공간에 저장된다.
int a = 10;
변수 a는 정수 10을 저장하고, 메모리 어딘가에 존재한다. 이 위치(주소)는 &a를 통해 알 수 있다.
cout << &a << endl; // 변수 a의 주소 출력
&변수명은 해당 변수의 주소값을 반환한다.
int a = 10;
cout << &a << endl; // a의 메모리 주소
*포인터는 포인터가 가리키는 주소에 저장된 값을 참조한다.
int a = 10;
int* p = &a;
cout << *p << endl; // 10 출력
p는 주소 자체
*p는 주소에 있는 값
int a = 10;
int* p = &a;
cout << a << endl; // 10
cout << &a << endl; // 0x100 같은 주소
cout << p << endl; // &a와 같은 주소
cout << *p << endl; // 10
포인터를 이용하면 변수의 값을 간접적으로 변경할 수 있다.
void addOne(int* ptr) {
*ptr += 1;
}
int main() {
int a = 5;
addOne(&a);
cout << a << endl; // 6 출력
}
&a로 주소를 전달
*ptr += 1로 해당 주소의 값을 변경
이것이 바로 Call by Reference
int arr[3] = {1, 2, 3};
cout << arr << endl; // arr은 arr[0]의 주소
cout << *arr << endl; // arr[0]의 값인 1 출력
cout << *(arr + 1) << endl; // arr[1] 값인 2 출력
즉, arr[i] == *(arr + i)
| 예시 | 설명 |
|---|---|
| 동적 메모리 할당 | new, malloc 등 |
| 다차원 배열 | int** 사용 |
| 문자열 처리 | char* 문자열 |
| 함수 인자 전달 | 참조(Call by Reference) |
| 구조체 접근 | -> 연산자 사용 (ptr->member) |