시작하기 앞서 자료구조 포스팅은 c++이 아닌 c언어로 진행됩니다! c언어는 c++과 달리 new, delete, struct 생성자/소멸자, template 없기에 불편할 수 있지만 자료구조를 보다 확실히 이해할 수 있습니다.
1. 동적 할당
int* data = (int*)malloc(sizeof(int));
int* array = (int*)malloc(sizeof(int) * SIZE);
malloc은 원하는 만큼 heap 메모리를 할당하고 주소를 반환합니다. 이 때 '원하는 만큼' 의 주소 뿐이며 어떤 형태도 정혀지지 않았습니다( 자료형 ), 즉 void pointer의 상태로 return 되기에 형변환을 해줘야 합니다!
동적할당은 크게 2가지 이유로 사용된다고 생각합니다. 첫 번째는 '인스턴스' 느낌으로 새로운 객체를 생성하는 것이며 두 번째는 가변 배열을 선언하는 것 입니다.
2. 포인터 ( 기본 )
int *ptr;
int **pptr;
struct Node *node;
void *vptr;
포인터는 위와 같이 모든 자료형에 대해 선언할 수 있습니다. 그 중에서 void pointer 는 아래에서 다루도록 하겠습니다.
모든 변수는 메모리에 저장되며 주소를 가지고 있습니다. 포인터는 기본적으로 '앞에 지정된 자료형'의 '주소'를 저장하는 자료형입니다. 혹시 '주소' 나 '포인터' 에 대해 더 자세히 알고 싶다면 포스팅을 참고해주세요.
int* 는 int의 주소를 저장하며 int** 는 int* 의 주소를 저장합니다. 포인터를 사용하여 주소에 직접 엑세스하기에 call-by-reference로 활용할 수 있습니다.
void 포인터는 해당 자료형의 특성 때문에 자료구조에서 Generic Data Structure 를 만들기 위해 사용됩니다. Generic DS는 사용자가 어떤 자료형을 사용할지 모르기에 '유연하게' 모든 자료형에 대해 사용할 수 있도록 만든 자료구조를 뜻합니다.
void 포인터의 특성은 '주소를 가지지만, 어떤 자료형인지 모른다' 입니다. 따라서 int, char, struct 등 모든 자료형의 주소를 가질 수 있습니다. 하지만 어떤 자료형인지 모르기에 '메모리 크기' 를 알지 못하며 연산, 엑세스를 할 수 없습니다. 따라서 접근할 때는 형변환을 해줘야합니다!
int a = 1;
char c = 'a';
void *ptr;
ptr = &a;
printf("%d ", *(int*)ptr);
ptr = &c;
printf("%d ", *(char*)ptr);
오랜만에 포스팅을 다시 시작해봤습니다. 저번에 pointer 에 대해 '심화' 를 다뤘었는데, 이번에는 활용을 중점으로 진행해봤습니다. 틀린 부분이 있다면 댓글 남겨주세요!
'코딩 > C, C++' 카테고리의 다른 글
[자료구조] Generic Dynamic Array 구현하기 ( 포인터 활용하기 ) (1) | 2024.10.20 |
---|---|
[자료구조] Ordered Linked List 구현하기 (0) | 2024.10.18 |
[C/C++] 자료형의 프로모션(실수 방지!) (0) | 2024.07.10 |
[C/C++] 포인터 완벽 이해 ( 포인터, 배열, 상수, 다중포인터 ) (0) | 2024.06.02 |
[C/C++] 부동소수점 - 컴퓨터는 정확하다며... (0) | 2024.03.30 |