728x90
반응형
C++ 포인터와 참조
C++에서 포인터와 참조는 프로그램에서 변수와 메모리를 효과적으로 관리할 수 있도록 해주는 중요한 도구입니다. 이번 글에서는 포인터와 참조의 개념, 사용 방법, 그리고 주요 차이점에 대해 알아보고, 실제 예제를 통해 이를 활용하는 방법을 설명하겠습니다.
1. 포인터란 무엇인가?
포인터(pointer)는 다른 변수의 메모리 주소를 저장하는 변수입니다. 포인터를 통해 메모리의 특정 위치에 직접 접근할 수 있습니다.
포인터의 선언과 초기화
#include <iostream>
using namespace std;
int main() {
int a = 10; // 정수형 변수 a 선언 및 초기화
int* p = &a; // 포인터 변수 p에 변수 a의 주소를 저장
cout << "a의 값: " << a << endl;
cout << "a의 주소: " << &a << endl;
cout << "포인터 p가 가리키는 값: " << *p << endl;
return 0;
}
실행 결과
a의 값: 10
a의 주소: 0x7ffee52e5c9c
포인터 p가 가리키는 값: 10
주요 연산자
&
(주소 연산자): 변수의 메모리 주소를 반환합니다.*
(역참조 연산자): 포인터가 가리키는 메모리 주소의 값을 반환하거나 수정합니다.
예제: 포인터를 통한 값 변경
int main() {
int a = 20;
int* p = &a;
cout << "a의 초기 값: " << a << endl;
*p = 30; // 포인터를 통해 변수 a의 값을 변경
cout << "포인터를 통해 변경된 a의 값: " << a << endl;
return 0;
}
실행 결과
a의 초기 값: 20
포인터를 통해 변경된 a의 값: 30
2. 참조란 무엇인가?
참조(reference)는 변수에 대한 별칭(alias)입니다. 참조를 사용하면 원본 변수와 동일한 메모리 공간을 공유하며, 간단하게 변수의 값을 참조하고 수정할 수 있습니다.
참조의 선언과 초기화
#include <iostream>
using namespace std;
int main() {
int a = 10; // 정수형 변수 a 선언 및 초기화
int& ref = a; // 변수 a에 대한 참조 선언
cout << "a의 값: " << a << endl;
cout << "ref의 값: " << ref << endl;
ref = 20; // 참조를 통해 a의 값 수정
cout << "참조를 통해 변경된 a의 값: " << a << endl;
return 0;
}
실행 결과
a의 값: 10
ref의 값: 10
참조를 통해 변경된 a의 값: 20
참조의 특징
- 참조는 초기화 시 반드시 기존 변수를 필요로 합니다.
- 참조는 초기화 후 다른 변수를 참조할 수 없습니다.
- 참조는 NULL 값을 가질 수 없습니다.
3. 포인터와 참조의 주요 차이점
특징 | 포인터 | 참조 |
---|---|---|
메모리 주소를 저장함 | 가능 | 불가능 |
초기화 필요 여부 | 선택 사항 | 필수 |
NULL 가능 여부 | 가능 | 불가능 |
다른 변수로 변경 가능 여부 | 가능 | 불가능 |
크기 | 일반적으로 4바이트 또는 8바이트 | 변수 크기와 동일 |
예제: 포인터와 참조 비교
int main() {
int a = 50;
// 포인터
int* p = &a;
cout << "포인터를 통해 a의 값: " << *p << endl;
*p = 60;
cout << "포인터를 통해 변경된 a의 값: " << a << endl;
// 참조
int& ref = a;
cout << "참조를 통해 a의 값: " << ref << endl;
ref = 70;
cout << "참조를 통해 변경된 a의 값: " << a << endl;
return 0;
}
실행 결과
포인터를 통해 a의 값: 50
포인터를 통해 변경된 a의 값: 60
참조를 통해 a의 값: 60
참조를 통해 변경된 a의 값: 70
4. 포인터와 참조의 활용
동적 메모리 할당
포인터는 동적 메모리 할당에서 중요한 역할을 합니다.
#include <iostream>
using namespace std;
int main() {
int* ptr = new int; // 동적 메모리 할당
*ptr = 100; // 할당된 메모리에 값 저장
cout << "동적 메모리의 값: " << *ptr << endl;
delete ptr; // 메모리 해제
return 0;
}
실행 결과
동적 메모리의 값: 100
함수 인자로 사용
참조는 함수의 인자로 자주 사용됩니다.
참조를 통한 값 변경
void changeValue(int& ref) {
ref = 42;
}
int main() {
int a = 10;
changeValue(a);
cout << "함수 호출 후 a의 값: " << a << endl;
return 0;
}
실행 결과
함수 호출 후 a의 값: 42
포인터를 통한 값 변경
void changeValue(int* ptr) {
*ptr = 42;
}
int main() {
int a = 10;
changeValue(&a);
cout << "함수 호출 후 a의 값: " << a << endl;
return 0;
}
실행 결과
함수 호출 후 a의 값: 42
5. 마무리
포인터와 참조는 C++에서 강력하면서도 유용한 도구입니다. 포인터는 메모리 주소를 직접 관리해야 하는 경우에 적합하며, 참조는 보다 직관적이고 간결한 코드를 작성할 때 유용합니다. 두 개념을 적절히 활용하면 프로그램의 효율성과 가독성을 모두 향상시킬 수 있습니다.
포인터와 참조를 이해하는 것은 C++ 프로그래밍의 핵심이므로, 예제를 통해 실습하고 다양한 상황에서의 동작을 실험해보는 것을 권장합니다.
반응형
'cpp' 카테고리의 다른 글
C++ 클래스와 객체 (0) | 2024.12.19 |
---|---|
C++ 동적 메모리 관리 (0) | 2024.12.19 |
C++ 배열과 문자열 (0) | 2024.12.18 |
C++ 함수 (0) | 2024.12.18 |
C++ 반복문 (0) | 2024.12.18 |