본문 바로가기
SW사관학교 정글/C언어와 친구들

[C언어와 친구들] 구조체(Struct)의 멤버가 포인터일 때, 구조체 포인터 변수 선언(동적메모리할당)

by 대범하게 2022. 10. 24.
반응형

구조체 포인터가 왜이렇게 헷갈릴까.

 

다시 복습.

- 포인터특정한 데이터가 저장된 주소값을 보관하는 변수

- 즉, 포인터도 변수다!

 

구조체 포인터도 마찬가지이다.

- 구조체를 가리키는 포인터구조체 포인터라고 한다.

- 즉, 구조체 포인터도 변수다!

 

int형 포인터 int *ptr1; 형식으로 선언했다.

여기서, 구조체는 struct [구조체 이름]이 자료형이다.

struct [구조체 이름]형 포인터struct student *ptr2; 형식으로 선언했다. 

 

여기서 struct가 있기 때문에 ptr2가 구조체라고 착각할 수 있지만 😵‍💫

ptr2는 구조체를 가리키는 포인터일 뿐 절대 구조체가 아니다. 💡💡💡💡💡💡💡

 

구조체를 가리키는 포인터로서 일반적인 포인터의 사용 방법이 비슷하지만, 구조체 멤버에 접근할 때는 '->'를 사용해야한다.

즉, '->' 화살표 연산자로 구조체 멤버에 접근할 수 있다. 


그렇다면 구조체 포인터 변수를 선언할 때 그 구조체 안에 포인터가 있다면 ?? 😶‍🌫️

 

d2->c=(*d2).c  라는 점을 이해하고 있다면 이해할 수 있는 예제이다. 

 

[구조체 포인터 변수 선언, 구조체 안에 포인터 변수가 있는 코드 예제]

#include <stdio.h>
#include <stdlib.h>

// 구조체의 정의(구조체 자료형 선언)
typedef struct Data{
    char c;
    int *numPtr; // 포인터
} Data;

int main(){
    int num = 10;
    Data d1;    // 구조체 변수 선언
    Data *d2 = malloc(sizeof(struct Data)); // 구조체 포인터 변수 선언 및 메모리 할당
    
    d1.numPtr = &num; // 구조체 d1의 멤버인 numPtr에 num의 메모리 주소를 전달 
    d2->numPtr = &num; // d2에 있는 Data의 메모리 주소를 역참조하여 멤버인 numPtr에 num에 num의 메모리 주소 전달

    printf("%d\n", *d1.numPtr); // 구조체의 멤버를 역참조
    // *d1.numPtr == *(d1.numPtr)
    printf("%d\n", *d2->numPtr); // 구조체 포인터의 멤버를 역참조
    // *d2->numPtr == *(d2->numPtr)

    // 출력결과 
    // 10
    // 10
    
    free(d2); // 동적 메모리 해제
    return 0;
}

첫 번째 경우는 구조체의 멤버를 역참조한 경우이고, 두 번째 경우는 구조체 포인터의 멤버를 역참조한 경우이다.

 

공부 참고

구조체 포인터 참고 블로그

구조체의 멤버가 포인터일 때, 구조체 포인터 변수 선언

반응형