오늘은 C,C++ 포인터에 대해 정리 해보겠습니다
포인터란?
먼저 간략하게 포인터를 설명하자면, 주소를 저장하는 변수라고 생각하면 이해가 쉽습니다.
우리가, 변수를 선언하게 되면 컴퓨터는 그 해당 변수의 데이터를 저장할 주소 또한 정해서 가지고 있게 됩니다.
쉽게 설명하기 위해 위 코드처럼 우리가 int형 변수 i를 선언했다고 합시다.
컴퓨터는 i라는 변수의 주소값을 임의로 정한 뒤, 해당 주소값에 int형 데이터 처리 방식으로 정수 10이라는 값을 저장하게 됩니다.
주소라는 개념이 이해가 안되실수 있기 때문에, 부연 설명을 드리자면 int i = 10이라는 코드를 작성할경우,
결국 10이라는 데이터가 컴퓨터 메모리상 어딘가에 저장이 되어있어야하는데 그 데이터가 존재하는 그 위치가 즉, 주소라고 보면됩니다.
포인터 선언 방법
포인터의 사용방법은 위 코드와 같습니다. 단순히 자료형 뒤에 *을 붙여주는게 끝입니다.
int * i_ptr은 int 자료형의 주소값을 저장하는 변수라고 생각하면 이해하기 좋습니다.
&i에서 &의 의미는 해당 변수의 주소값을 의미합니다.
앞서 우리가 포인터는 주소를 저장하는 변수라고 설명을 했듯이, 변수 앞에 &을 붙여 주소값으로 저장해야합니다.
포인터 i_ptr의 값을 출력해보면 위와 같이 주소 값이 저장이 되어있는것을 확인할 수 있습니다.
포인터 주소에 있는 데이터를 출력하는 방법
그렇다면 주소값을 출력하는 것이 아닌 해당 주소에 있는 데이터값을 출력하고 싶다면 해야할까요?
해당 주소에 있는 데이터 값을 출력하려면 포인터 변수 앞에 *을 붙여주면 됩니다.
출력 결과는 위와 같이 10이 나온것을 확인할 수 있습니다.
포인터에 저장되어있는 주소에 접근하여 데이터를 수정하는 방법
포인터의 중요한 핵심 기능은 해당 변수의 주소에 접근하여 그 값을 직접 수정할 수 있다는 점입니다.
위 코드와 같이 포인터를 통해 해당 주소값에 있는 데이터 값을 변경할 수 있습니다.
포인터의 중요한 개념
누군가 포인터가 뭐냐고 물었을 때 "주소를 저장하는 변수다"라고 이야하기하면 틀린것은 아닙니다.
하지만 거기에 더해서 알아야할 중요한 개념이 있습니다.
포인터가 단순히 주소를 저장하는 변수라면 왜 int*, char*; float*과 같이 자료형으로 포인터를 구분하는 것일까요?
그냥 구분하지 말고 포인터 변수 하나로 주소값만 저장하면 되는거 아닌가요?라고 생각하실수 있습니다.
그 이유에 대해 설명하자면,
포인터는 단순히 주소를 저장하는 것 뿐만아니라, 해당 주소에 위치한 데이터를 해석하는 방식 또한 내포 되어있습니다.
int* i_ptr의 앞에 붙은 int*의 의미는 저장된 주소에 int형 방식으로 접근하여 해석하겠다는 의미입니다.
즉, int는 4byte 이므로 해당 주소에 접근하여 4byte만큼 읽어들이고, 해당 데이터를 정수형 표현방식으로 해석하겠다는 의미입니다.
같은 데이터라도 어떻게 해석하냐에 따라 그 값은 달라집니다.
int, float과 같이 정수형 데이터 표현방식과 실수형 데이터 표현방식은 다릅니다.
컴퓨터는 같은 10이라고 해도 정수냐 실수냐에 따라 데이터를 다르게 저장합니다.
또한 8byte 정수형 저장공간을 가지고 있는 longlong 타입에 int*로 접근하면 어떻게 될까요?
4byte만큼 만 읽어 와서 해석하기 떄문에 엉뚱한 값을 받아올 수도, 저장할 수도 있습니다.
아래 예시를 통해 이해를 돕겠습니다.
i = 10, f = 10으로 둘다 똑같은 10이라는 값을 가지고 있습니다.
이후 int* i_ptr에 f의 주소에 있는 데이터 값을 넣고 해당 값을 출력하겠습니다.
위에 출력 결과를 통해 알 수 있듯이 10이아닌 엉뚱한 값이 나온것을 확인 할 수 있습니다.
그 이유는 컴퓨터가 float f 변수를 저장할 때 실수형 데이터 저장방식으로 10이라는 숫자를 저장하게 되었고
우리는 그 값을 정수형 데이터 방식으로 해석하여 출력했기 때문입니다.
앞서 설명한 포인터의 개념을 이해했다면 이러한 결과는 당연하다고 볼 수 있습니다.
정리 및 요약
1. 포인터 변수는 주소값을 저장하는 변수이다.
2.포인터 변수를 어떠한 자료형(data type)으로 정했는지에 따라 주소에 들어있는 값을 해석하는 방식이 달라진다.
3. 포인터를 통해 해당 주소에 존재하는 값을 직접 수정하는 것이 가능하다.
'C++' 카테고리의 다른 글
C++ 외부변수 extern 사용법 (0) | 2023.11.24 |
---|---|
C++ 정적 변수 (0) | 2023.11.23 |
C++ 헤더 파일에 함수 기능을 구현해 놓지 않는 이유 (0) | 2023.11.09 |
C++ 분할 구현 (헤더 파일) (0) | 2023.11.09 |
C++ 함수 호출(메모리 영역) (0) | 2023.11.05 |