[C언어/C++] 구조체 포인터 사용법 & 예제 총정리

    구조체에서 포인터가 사용되는 경우는 아래와 같이 크게 3가지로 구분됩니다.

     

    1. 멤버 변수로 포인터 사용하기

    2. 구조체 변수로 포인터 사용하기

    3. 구조체 간의 상호 참조

     

    멤버 변수로 포인터 사용하기

    #include <stdio.h>
    struct Score {
        int *kor; //국어성적
        int *mat; //수학성적
        int *eng; //영어성적
    };
    
    int main()
    {
        int score1 = 100;
        int score2 = 90;
        int score3 = 80;
    
        struct Score s;
        s.kor = &score1;
        s.mat = &score2;
        s.eng = &score3;
    
        printf("국어점수 : %d\n", *s.kor);
        printf("수학점수 : %d\n", *s.mat);
        printf("영어점수 : %d\n\n", *s.eng);
    
        score1 = 50;
        score2 = 40;
        score3 = 30;
    
        printf("국어점수 : %d\n", *s.kor);
        printf("수학점수 : %d\n", *s.mat);
        printf("영어점수 : %d\n", *s.eng);
    
        return 0;
    }
    

    구조체의 멤버에 포인터를 선언한 후 다양하게 사용할 수 있습니다. 이렇게 선언된 구조체 안의 포인터들은 변수들의 주소를 저장할 수 있으며 포인터가 그 변수들의 주소 값을 가리키고 있으므로 그 변수의 값들이 바뀔 때 유동적으로 값이 바뀌는 객체들을 생성할 수 있게 됩니다.

     

    구조체 변수로 포인터 사용하기

    #include <stdio.h>
    struct Score {
        int kor; //국어성적
        int mat; //수학성적
        int eng; //영어성적
    };
    
    int main()
    {
        struct Score s = { 100,90,80 };
        struct Score* p = NULL;
    
        p = &s;
        printf("구조체 s의 주소값 : %p\n", s);
        printf("국어 : %d 수학 : %d 영어 : %d \n", s.kor, s.mat, s.eng);
        printf("국어 : %d 수학 : %d 영어 : %d \n", (*p).kor, (*p).mat, (*p).eng);
        printf("국어 : %d 수학 : %d 영어 : %d \n", p->kor, p->mat, p->eng);
    
        return 0;
    }
    

    이전에 함수에서 살펴봤듯 구조체도 마찬가지로 주소 값이 있습니다. 위의 예제처럼 %p로 구조체를 확인해보면 주소 값을 확인하실 수 있습니다. 구조체 변수로 포인터를 사용한다는 의미는 구조체 변수에 간접 접근할 수 있다는 의미입니다.  

     

    구조체 간의 상호 참조

    #include <stdio.h>
    struct Score {
        int kor; //국어성적
        int mat; //수학성적
        int eng; //영어성적
        struct Score *link1; //자기참조 구조체 선언
        struct sub_Score *link2; //외부참조 구조체 선언
    };
    
    struct sub_Score {
        int soc; //사회성적
        int sci; //과학성적
    };
    
    
    int main()
    {
        struct Score s1 = { 100,100,100,NULL,NULL};
        struct Score s2 = { 50,50,50,NULL,NULL };
        struct Score s3 = { 0,0,0,NULL,NULL };
    
        s1.link1 = &s2; //s1 -> s2 자기 참조
        s2.link1 = &s3; //s2 -> s3 자기 참조
    
        printf("국어 : %d 수학 : %d 영어 : %d \n", s1.kor, s1.mat, s1.eng);
        printf("국어 : %d 수학 : %d 영어 : %d \n", s1.link1->kor, s1.link1->mat, s1.link1->eng);
        printf("국어 : %d 수학 : %d 영어 : %d \n", s1.link1->link1->kor, s1.link1->link1->mat, s1.link1->link1->eng);
        
        struct sub_Score sub1 = { 100,100 };
        struct sub_Score sub2 = { 50,50 };
        struct sub_Score sub3 = { 0,0 };
    
        s1.link2 = &sub1; //s1 -> sub2 외부 참조
        s2.link2 = &sub2; //s2 -> sub3 외부 참조
        s3.link2 = &sub3; //s2 -> sub3 외부 참조
    
        printf("사회 : %d 과학 : %d \n", s1.link2->soc, s1.link2->sci);
        printf("사회 : %d 과학 : %d \n", s2.link2->soc, s2.link2->sci);
        printf("사회 : %d 과학 : %d \n", s3.link2->soc, s3.link2->sci);
    
        return 0;
    }
    

    포인터를 사용해서 구조체 자신이나 다른 구조체들끼리 서로 참조할 수 있게 할 수 있습니다. 구조체 간에 상호 참조를 할 수 있게 하는 방법은 자기 자신을 참조하는 자기 참조가 있고 외부의 구조체를 참조하는 외부 참조가 있습니다. 먼저 자기 참조의 경우 자기 자신을 참조하여 link1 변수를 통해 쭉 연결이 되게 되어 있습니다. 위의 예제를 한번 실행시켜 보시면 이해가 바로 되실 것입니다. 또한 외부의 구조체를 참조하여 외부의 구조체도 사용을 할 수 있습니다.

    댓글(0)

    Designed by JB FACTORY