구조체 선언
#include <stdio.h>
struct student //구조체 선언 방법
{
int age;
char phone_number[14];
int s_id;
};
int main()
{
struct student goorm = { .age = 20, .phone_number = "010-1234-5678", 10 };
struct student codigm = { 22, "010-8765-4321"};
//main에서 한 번더 선언 필요, .age=20 또는 22 두가지의 방식으로 초기화 가능
//초기화 하지 않은 값은 0이 들어가있음
printf("나이 : %d, 번호 : %s, 학번 : %d\n", goorm.age, goorm.phone_number, goorm.s_id);
printf("나이 : %d, 번호 : %s, 학번 : %d\n", codigm.age, codigm.phone_number, codigm.s_id);
return 0;
}
typedef
typedef는 c언어에서 기존 타입에 새로운 이름(별칭)을 부여하는 키워드로 코드 가독성을 높이고 유지보수를 쉽게 할 수 있다.
#include <stdio.h>
typedef struct _Student { //사실 구조체 이름(_Student)도 생략 가능 -> 익명구조체라 함
int age;
char phone_number[14];
} Student; //구조체 별칭
//구조체 이름과별칭은 동일하게 써도 되지만 구분을 위해 이름은_붙이는게 편함
int main(){
Student goorm; //typedef는 구조체를 선언할 때 struct를 붙일 필요가 없음
Student arr[3]={{10},{20},{24}}; // 구조체 배열
printf("나이 : ");
scanf("%d", &goorm.age); //값에 다가가기 위해서는 .age사용
printf("번호 : ");
scanf("%s", goorm.phone_number);
printf("----\n나이 : %d\n번호 : %s\n----", goorm.age, goorm.phone_number);
return 0;
}
구조체 포인터
#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);
}
중첩 구조체
#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;
}
자기 참조 구조체
자기 참조 구조체는 구조체 내부에 자기 자신을 가리키는 포인터 멤버를 포함하는 구조체이다.
주로 연결리스트, 트리, 그래프 등의 동적 자료 구조를 구현할 때 사용된다.
typedef struct {
char name[15];
int age;
struct Student *ptr; //자기 자신을 가리키는 포인터
} Student;
구조체 함수
구조체는 공간을 많이 차지하기 때문에 매개변수로 구조체를 넘겨줄때는 포인터 사용하는 편이 좋다.
#include <stdio.h>
typedef struct {
int s_id;
int age;
} Student;
void print_student(Student *s){
s->s_id = 2000;
s->age = 25;
printf("학번 : %d, 나이 : %d\n", s->s_id, s->age); //2000 25 출력
}
int main(){
Student s;
s.s_id = 1000;
s.age = 20;
print_student(&s);
printf("학번 : %d, 나이: %d\n", s.s_id, s.age);
//포인터를 사용해 주소의 값을 변경했으니까 2000 25
}

