포인터란?
컴퓨터의 메인 메모리는 여러 바이트로 구성되어 있고 각 바이트는 8비트의 정보를 저장 가능. 실행 가능한 프로그램은 코드(C프로그램의 명령어에 대응하는 기계어)와 데이터(프로그램의 변수들)로 구성. 각 변수는 메모리의 1개 이상의 바이트를 점유. 변수가 사용하는 주소의 첫번째 바이트 주소는 그 변수의 주소이다. 주소를 숫자로 표현할 수는 있지만, 값의 범위가 정수형의 범위와 다를 수 있으므로 일반적인 정수 변수에 저장할 수 없다. 때문에 포인터라는 변수를 만들어 주소를 저장한다. 예를 들면 포인터 변수 A에 변수 N의 주소를 저장한다. 이때 "A는 N을 가리킨다."(point to)라고 한다.
즉, 포인터는 주소를 저장하는 변수이다.
포인터 변수의 선언 : 식별자 앞에 asterisk(*)를 붙여서 선언.
ex) int * p, double *q, char *r ...
*포인터는 정수형이나 실수형 변수의 주소뿐만 아니라 함수나 변수에 속하지 않는 메모리 영역을 가리킬 수도 있으며, 다른 포인터까지 가리킬 수도 있다. 즉, 포인터는 변수뿐만이 아니라 오브젝트를 가리킨다.
주소 연산자(The Address and Indirection Operators)
포인터와 관련된 연산자는 주소 연산자 &(address), *(indirection)이 있다.
ex) x가 변수 ㅡ> &x는 x의 메모리 상 주소, p가 포인터 ㅡ> *p는 p가 가리키는 오브젝트(값).
포인터를 사용하는 이유
C, C++에서는 매개변수를 주소가 아닌 값으로 넘겨준다. 이것을 pass by value라고 한다. 따라서 함수에 인자를 전달할 때는 기본적으로 값이 복사되어 함수로 넘겨지고, 복사되어 넘겨지기 때문에 함수 내에선 아무리 변경해도 함수 내 지역변수에만 영향을 미칠 뿐 원본 값에는 영향을 미칠 수 없는 것이다.
ㅡ> 이때 함수 내에서 전달받은 매개변수의 원본 값을 변경하고 싶을 때 사용하는 것이 포인터이다. 포인터와 주소 연산자를 사용하면 변수의 주소에 있는 값을 변경할 수 있기 때문에 매개변수로 포인터를 넘겨주게 된다면 포인터가 가리키는 변수인 원본을 변경할 수 있게 되는 것이다. 즉, pass by value를 pass by reference로 바꾸면 된다는 이야기이다.
포인터를 사용하는 구체적인 이유
1. 메모리 직접 접근
2. 동적 메모리 할당(new/delete, malloc/free)
3. 효율적인 데이터 전달(pass by reference)
4. 다형성
5. 콜백 함수 및 함수 포인터
*참조 : 1, 2번을 통해 유동적인 메모리 관리가 가능하게 되어 사용하기에 따라 성능 향상을 이끌어 낼 수도 있고, 3번을 통해 pass by value 대신 pass by reference를 함으로써 불필요한 복사 연산을 줄여 성능 차이를 만들어낼 수도 있음.
참고자료
[C/C++] 포인터를 사용하는 이유
포인터를 사용하는 이유 포인터가 왜 필요할까? 포인터를 왜 쓸까? 포인터를 왜 사용할까? 에 대해서 생각해보기 전에... 포인터에 대해서 잘 모른다면 아래 '포인터란 무엇인가'부터 읽어보자.
upbo.tistory.com
'C++' 카테고리의 다른 글
[C++] STL 요약 정리 #1 (0) | 2025.02.17 |
---|---|
[C++] STL(Standard Template Library) (0) | 2025.01.15 |
[C++] 메모리 누수 점검 (0) | 2025.01.02 |
[C++] 오버로딩(overloading), 오버라이딩(overriding), 템플릿(Template) (1) | 2024.12.31 |
[C++] 참조자(Reference) (0) | 2024.12.26 |