thecode

[Clang] 구조체 포인터 본문

Clang

[Clang] 구조체 포인터

hyeontack 2020. 8. 19. 20:26

안녕하세요 THECODE에 방문해주셔서 감사합니다.


다른 자료형과 마찬가지로 구조체도 포인터를 선언할 수 있으며 구조체 포인터에는 malloc 함수를 사용하여 동적 메모리를 할당할 수 있습니다.

  • struct 구조체이름 *포인터이름 = malloc(sizeof(struct 구조체이름));

먼저 struct Person *p1과 같이 struct 키워드와 구조체 이름을 사용하여 구조체 포인터를 선언합니다. 이때 일반 변수가 아닌 포인터 변수이므로 반드시 *을 붙입니다. 그리고 malloc 함수로 메모리를 할당할 때 크기를 알아야 하므로 sizeof(struct Person)과 같이 구조체 크기를 구하여 넣어줍니다.

struct Person *p1 = malloc(sizeof(struct Person));    // 구조체 포인터 선언, 메모리 할당

다소 문법이 복잡하지만 구조체 이름 앞에는 반드시 struct 키워드를 붙여야 한다는 점만 기억하면 쉽습니다. 즉, 포인터를 선언할 때도, sizeof로 크기를 구할 때도 struct 키워드를 넣어줍니다.

 

그런데 구조체의 멤버에 접근하는 방법이 조금 특이합니다. 지금까지 . (점)을 사용해서 멤버에 접근했지만 구조체 포인터의 멤버에 접근할 때는 -> (화살표 연산자)를 사용합니다.

 

p1->age = 30;과 같이 구조체 포인터의 멤버에 접근한 뒤 값을 할당하고, p1->age와 같이 값을 가져옵니다. p1->name 등의 문자열 멤버는 = (할당 연산자)로 저장할 수 없으므로 strcpy 함수를 사용하면 됩니다.

마지막으로 free(p1);처럼 할당한 메모리를 해제해줍니다. 즉, 구조체에 메모리를 할당할 때는 malloc → 사용 → free 패턴을 기억하세요.

 

구조체 포인터와 ->구조체 포인터에 접근할 때 ->를 사용하는데 ->는 화살표 연산자(arrow operator)라고 부릅니다.

포인터는 메모리 주소를 저장하므로 어떤 값이 있는 곳을 "가리키다"라는 의미가 있지요. 그래서 연산자도 어떤 값이 있는 곳을 가리킨다는 의미에서 화살표 모양을 사용합니다.

 

앞으로 프로그램을 작성할 때는 구조체 별칭을 적극적으로 활용하세요.

구조체 별칭으로 선언한 포인터도 구조체 멤버에 접근할 때는 -> (화살표 연산자)를 사용합니다.


Reference

  1. https://dojang.io/mod/page/view.php?id=418

'Clang' 카테고리의 다른 글

[Clang] README  (0) 2020.08.20
[Clang] 기초 문법  (0) 2020.08.20
[Clang] Hello, world  (0) 2020.08.19
[Clang] 구조체  (0) 2020.08.19
Comments