당니의 개발자 스토리
[필수개념] 메모리와 포인터(pointer) #2 포인터 본문
[필수개념] 메모리와 포인터(pointer) #2 포인터
clainy 2024. 2. 6. 12:28메모리와 포인터(pointer) #2 포인터
메모리 관리는 언어마다 다르게 관리된다. Java, Python, JavaScript는 개발자가 직접 변수에 메모리를 할당하거나 해제할 수 없고, 가비지 컬렉터를 통해 이를 수행한다.

Java의 JVM 아키텍처이다. 하위레벨 언어인 C, C++ 등은 가비지 컬렉터가 없으며 대신, 개발자가 좀더 핸들링할 수 있다. 개발자가 직접 필요한 메모리를 예약하고 해제할 수 있으며, 포인터 또한 지원한다.
포인터
변수의 메모리 주소를 담는 타입이 바로 포인터다.

포인터는 메모리 동적할당이나, 데이터를 복사하지 않고 함수 매개변수로 사용하거나, 클래스 및 구조체를 연결할 때 사용된다.
연결리스트의 노드를 예시로 들어보자.
먼저, 연결리스트에 대해서 설명하겠다.

data가 있고, 이 data를 감싸는 Node 라는 class가 있다.

그리고 이 Node 라는 class는 next 라는 포인터를 가진다. 이 next 라는 포인터는 그 다음 노드의 주소값을 가리킨다. 그 다음 노드의 전체적인 데이터를 가지고 있는 게 아니라, 주소값만 가리키고 있는 거다.
이 주소값을 가리키는 포인터인 next를 가지고 있는 자료구조가 연결리스트의 노드다. 정확히는 싱글 연결리스트다. 왜냐면, next 라는 포인터밖에 없기 때문이다.
만약에 prev 라는 포인터가 있고, 그 포인터가 그 이전 노드를 가리킨다면, 더블 연결리스트가 된다.

여기서 중요한 건, 지금 보는 것처럼 next가 다음 노드의 주소값을 가리키는 것으로 포인터가 활용이 되고 있다는 것이다.
이렇게 하면 뭐가 좋을까?
그 다음 노드의 전체적인 데이터를 가지고 있지 않아도 이런 식으로 주소값만 가져서 다음 노드에 대한 값을 참조를 할 수가 있다.
이제 c++로 실습을 해보자.

포인터는 이렇게 할당을 한다.

앰퍼샌드(&)로 주소를 할당할 수 있고, 타입은 주소를 할당하려고 하는 변수의 타입명과 일치해야한다.

int * 부분이 포인터이다. int * : int 형 포인터다.

double *는 double 형 포인터이다. 그런데 이 포인터의 크기는 얼마일까?
int는 4바이트를 쓰는 변수이고, double은 8바이트를 쓰는 변수이다.

double *의 크기와 int *의 크기는 같을까?
흔히들 착각하는 게 double형 포인터는 8바이트 int형 포인터는 4바이트 이렇게 생각한다.

sizeof()를 사용해서 확인해보면, 똑같이 8바이트가 나온다.

이렇듯 포인터의 크기는 OS 체제의 비트마다 다르다.

programiz를 운영하는 내부 서버 자체가 64bit이기 때문에 8바이트로 통일돼서 나오는 거다.
따라서 포인터의 크기는 고정되어있다.
'10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트 > 0주차 : 강의소개와 C++의 기본' 카테고리의 다른 글
| 구현문제를 잘 푸는 방법 (0) | 2024.02.28 |
|---|---|
| [필수개념] 메모리와 포인터(pointer) #4 array to pointer decay (0) | 2024.02.06 |
| [필수개념] 메모리와 포인터(pointer) #3 역참조연산자 (0) | 2024.02.06 |
| [필수개념] 메모리와 포인터(pointer) #1 메모리와 주소 (0) | 2024.02.06 |
| [필수개념] split() 함수 (0) | 2024.02.03 |