Study_Cat

꾸준히 공부하는 고양이가 될게요.

끊임없는 노력은 천재를 이긴다.

코딩/C, C++

[자료구조] 포인터와 동적 할당, 자료구조 입문하기! (with c언어)

Study_Cat 2024. 10. 18. 15:07

 시작하기 앞서 자료구조 포스팅은 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 는 아래에서 다루도록 하겠습니다.

 

 모든 변수는 메모리에 저장되며 주소를 가지고 있습니다. 포인터는 기본적으로 '앞에 지정된 자료형'의 '주소'를 저장하는 자료형입니다.  혹시 '주소' 나 '포인터' 에 대해 더 자세히 알고 싶다면 포스팅을 참고해주세요.

 

[C/C++] 포인터 완벽 이해 ( 포인터, 배열, 상수, 다중포인터 )

오늘은 C언어를 입문하는 사람에게 가장 어렵다고 소문난 포인터를 쉽게 이해할 수 있도록 설명해보겠습니다. 잘 이해되지 않는 부분은 댓글로 남겨주세요. 연산자 ( 배경지식 )&(변수 이름) =

study-cat.tistory.com

 

 

 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 에 대해 '심화' 를 다뤘었는데, 이번에는 활용을 중점으로 진행해봤습니다. 틀린 부분이 있다면 댓글 남겨주세요!