[C언어/C++] 구조체 포인터 사용법 & 예제 총정리
- Language/C , C++ , C#
- 2021. 1. 16.
구조체에서 포인터가 사용되는 경우는 아래와 같이 크게 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 변수를 통해 쭉 연결이 되게 되어 있습니다. 위의 예제를 한번 실행시켜 보시면 이해가 바로 되실 것입니다. 또한 외부의 구조체를 참조하여 외부의 구조체도 사용을 할 수 있습니다.
'Language > C , C++ , C#' 카테고리의 다른 글
[C언어/C++] 10진수를 8진수, 16진수로 출력하기 (0) | 2021.01.28 |
---|---|
[C언어/C++] 열거형 enum 사용법 & 예제 (3) | 2021.01.17 |
[C언어/C++] 구조체 사용법 & 예제 총정리 (0) | 2021.01.15 |
[C언어/C++] 함수 포인터 사용법 & 예제 총정리 (2) | 2021.01.14 |