프로그래밍 언어/C

C언어 27강)+ 구조체(struct)의 멤버가 포인터 일 때, 구조체 포인터 변수 선언(동적메모리할당)

happy_life 2020. 11. 15. 22:36

전 시간에 구조체 포인터에 대해 배웠다.

 

구조체 포인터란?

 

C언어 27강) 구조체 포인터 기본

구조체 포인터 구조체를 가리키는 포인터로서 일반적인 포인터의 사용 방법이 비슷하지만, 구조체 멤버에 접근할 때는 '->'를 사용해야 한다 (*p1). name = p1 -> name ▲매번 *과 ( )를 사용하기 불편하

abcdefgh123123.tistory.com

그렇다면 구조체 포인터 변수를 선언할 때 그 구조체 안에 포인터가 있다면?? 굉장히 복잡하지 않을까? 뭔 소린지 모르겠을 것이다. 맞다 그냥 코드를 보자.

 

d2-> c = (*d2).c    라는 점과   포인터 변수의 개념 자체를 확실히 이해하고 있어야 밑의 코드를 이해할 수 있다.

 

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

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

struct Data {
    char c;
    int *numPtr;    // 포인터
};

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

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

    d2->c = 'b';                   //구조체 포인터 역참조하여 멤버 c에 접근해 b 값 넣기
    
    printf("%c\n", (*d2).c);      //  b: 구조체 포인터를 역참조하여 c에 접근
                                   // d2->c과 같음

    printf("%d\n", *(*d2).numPtr); // 10: 구조체 포인터를 역참조하여 numPtr에 접근한 뒤 다시 역참조
                                   // *d2->numPtr과 같음

    free(d2);

    return 0;
}

 

 

결괏값

 

포인터 참조의 논리적 구조를 표현하면 밑의 그림처럼 된다.