포인터는 어떤 변수의 주소를 담아서 가리키는 변수이다. 구조체 포인터는 구조체를 가리키는 포인터를 구조체 포인터라고 한다.
int형 포인터는int*ptr;
형식으로 선언했다.
구조체는struct [구조체 이름]
이 자료형이나 마찬가지이다.
따라서struct student *ptr;
과 같이 선언해야 한다.
ptr
은 구조체를 가리키는 포인터일 뿐 절대 구조체가 아니다.
#include <stdio.h>
typedef struct {
int s_id;
int age;
} Student;
int main(){
Student goorm;
Student *ptr;
ptr = &goorm;
(*ptr).s_id = 1004;
(*ptr).age = 20;
printf("goorm의 학번 : %d, 나이: %d\n", goorm.s_id, goorm.age);
}
goorm의 학번 : 1004, 나이: 20
구조체 포인터를 사용하기 위해서는 항상 괄호를 사용해야 한다.
그래서->
라는 기호를 사용하면 괄호를 사용하지 않아도 알아서 주소로 찾아가서 구조체를 참조한다.
#include <stdio.h>
typedef struct {
int s_id;
int age;
} Student;
int main(){
Student goorm;
Student *ptr;
ptr = &goorm;
(*ptr).s_id = 1004;
ptr->age = 20;
printf("goorm의 학번 : %d, 나이: %d\n", goorm.s_id, goorm.age);
}
goorm의 학번 : 1004, 나이: 20
괄호를 이용한 것과 마찬가지로 정상적으로 값이 대입된다.
구조체 안에 구조체를 선언할 수 있다.
#include <stdio.h>
typedef struct {
char name[15];
int age;
} Teacher;
typedef struct {
char name[15];
int age;
Teacher teacher;
} Student;
int main(){
Student Student;
Teacher Teacher;
Student.teacher.age = 30;
Teacher.age = 40;
return 0;
}
이런 식으로 다른 구조체를 멤버로 포함할 수 있다. 이럴 경우, Student안의 Teacher 구조체를 이용하고 싶으면,
Student.teacher.age
와 같이 연속으로 멤버를 참조해야 사용할 수 있다. 물론 Teacher 구조체만 사용할 수도 있다.
구조체는 자기 자신을 참조하도록 자기와 똑같은 타입의 구조체를 멤버로 가질 수 있다.
typedef struct {
char name[15];
int age;
struct Student *ptr;
} Student;
구조체에서는 위와 같이 자기 자신을 가리키는 포인터를 멤버로 가질 수 있다.
이렇게 자기 참조 구조체는 연결 리스트나 트리를 만들 때 사용된다.