구조체의 형태
struct 구조체 이름 { 구조체 멤버들 };
-----------------
자료형 부분
구조체의 예시
struct student
{
char name[15];
int s_id;
int age;
char phone_number[14];
};
int main()
{
**struct student goorm**;
printf("이름 : %s, 학번 : %d, 나이 : %d, 번호 : %s\\n", goorm.name, goorm.s_id, goorm.age, goorm.phone_number);
return 0;
}
구조체 초기화
.변수명 = 00
#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 };
printf("나이 : %d, 번호 : %s, 학번 : %d\\n", goorm.age, goorm.phone_number, goorm.s_id);
return 0;
}
typedef를 이용한 구조체 선언
- typedef : C언어에서 자료형을 새롭게 이름 붙일 때 쓰는 키워드
- 구조체를 정의할 때 중괄호 뒤에 별칭을 써주면 됨
#include <stdio.h>
typedef struct _Student {
int age;
char phone_number[14];
} **Student;**
int main(){
**Student goorm; // struct student gorrm 이라고 할 필요 없이 별칭만 씀**
printf("나이 : ");
scanf("%d", &goorm.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 age;
char phone_number[14];
} Student;
int main(){
**Student goorm;**
printf("나이 : ");
scanf("%d", &goorm.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 {
char name[30];
int age;
} Student;
int main(){
Student goorm[3] = { {.name = "해리 포터"}, {.name = "헤르미온느 그레인저"}, {.name = "론 위즐리"} };
**// 문자열은 선언할 때만 초기화할 수 있으므로, 문자열은 선언과 동시에 초기화 필요**
goorm[0].age = 10;
goorm[1].age = 10;
goorm[2].age = 10;
printf("이름 : %s / 나이 : %d\\n", goorm[0].name, goorm[0].age);
printf("이름 : %s / 나이 : %d\\n", goorm[1].name, goorm[1].age);
printf("이름 : %s / 나이 : %d\\n", goorm[2].name, goorm[2].age);
return 0;
}
구조체 포인터
- 구조체를 가리키는 포인터
- 포인터를 사용할 때 *ptr.age 라고 하는 게 아니라, (*ptr).age 와 같이 괄호 사용 필요 (온점도 연산자이기 때문)
- ptr -> 변수 이렇게 써도 됨!
#include <stdio.h>
typedef struct {
int s_id;
int age;
} Student;
int main(){
Student goorm;
**Student *ptr;** **// 구조체를 가리키는 포인터**
ptr = &goorm;
**(*ptr).age = 20;**
**ptr->age = 20; // 이런 기호를 쓸 수도 있음**
**printf("goorm의 나이: %d\\n", 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);
}
int main(){
Student s;
s.s_id = 1000;
s.age = 20;
print_student(&s);
printf("학번 : %d, 나이: %d\\n", s.s_id, s.age);
}
'스터디 노트 > C언어 기초' 카테고리의 다른 글
C언어 기초 > 10장 동적 메모리 할당 (0) | 2021.12.07 |
---|---|
C언어 기초 > 08강 포인터 (0) | 2021.12.05 |
C언어 기초 > 07장 배열과 문자열 (0) | 2021.12.04 |
C언어 기초 > 06장 함수 (0) | 2021.12.03 |
C언어 기초 > 05장 조건문 (0) | 2021.12.02 |