선언
#inlcude <studio.h>
struct student
{
char name[15];
int s_id;
int age;
char phone_number[14];
};
C
복사
•
다양한 자료형을 한번에 선언할 수 있다.
•
main() 문 이전에 선언해야 한다.
•
이를 main 함수 안에 따로 선언을 해야 사용할 수 있다.
◦
struct [구조체 이름] 으로 선언한다.
◦
선언 후에는 구조체 멤버를 사용한다.
▪
변수이름.구조체 멤버의 이름 으로 사용한다.
▪
멤버값을 초기화 할때는 { .멤버이름 = 값 } 과 같은 형태로 초기화 한다.
▪
멤버이름을 적지 않을 때에는 정의 순서대로 값이 들어간다.
▪
값을 넣어주지 않으면 0 으로 초기화 된다.
typedef
•
구조체 별칭을 사용하면 main 함수에서 구조체를 선언할 때 매번 struct 를 쓸 필요가 없다.
•
구조체 별칭은 중괄호 뒤에 쓴다.
#inlcude <studio.h>
typedef struct _User
{
char name[15];
int s_id;
int age;
char phone_number[14];
} User; // 별칭
int main() {
User user; // 구조체 선언
...
}
C
복사
•
구조체 이름을 생략할 수도 있다.
#inlcude <studio.h>
typedef struct
{
char name[15];
int s_id;
int age;
char phone_number[14];
} User; // 별칭
int main() {
User user; // 구조체 선언
...
}
C
복사
구조체 배열
•
구조체에도 배열이 존재한다.
•
선언과 초기화 방법은 아래와 같다.
#include <studio.h>
typedef struct {
char name[30];
int age;
} Student;
int main() {
Student goorm[2] = { {.name = "김시은"}, {.name = "김지은"} };
goorm[0].age = 20;
goorm[1].age = 20;
...
}
C
복사
◦
구조체도 문자열은 선언할 때만 초기화 가능하기 때문에 선언과 동시에 초기화 해주어야 한다.
◦
나이는 선언 후에 값을 대입해도 괜찮다.
구조체와 함수
•
구조체를 인자로 전달할 때에는 두가지 방법이 있다.
◦
포인터로 전달하거나
◦
구조체 그대로 전달하거나
•
포인터를 사용하지 않고 넘겨주면 매개변수에 복사되므로 원본에는 영향을 미치지 않는다.
◦
어떤 변수의 값을 가져와서 출력하거나
◦
원본값을 수정할 필요가 없는 경우
포인터를 사용하지 않고 그냥 복사해서 넘겨준다.
•
구조체 크기가 커질수록 복사공간이 필요하다.
◦
공간낭비가 커 비효율 적이기 대문에, 매개변수로 구조체를 전달할 때에는 보통 포인터를 사용한다.
◦
값을 바꿀 필요가 없는 경우도 마찬가지다.
포인터 없이 구조체를 인자로 전달하는 경우
#include <studio.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
복사
결과
학번 : 2000, 나이 : 25
학번 : 1000, 나이 : 20
Plain Text
복사
포인터로 구조체를 인자로 전달하는 경우
#include <studio.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
복사
결과
학번 : 2000, 나이 : 25
학번 : 2000, 나이 : 25
Plain Text
복사
문제 풀이
#include <stdio.h>
typedef struct
{
char name[50];
int kor;
int eng;
int math;
float avg;
} Student;
int main()
{
Student student[3];
for(int i = 0; i < 3; i++)
{
scanf("%s", student[i].name);
scanf("%d", &student[i].kor);
scanf("%d", &student[i].eng);
scanf("%d", &student[i].math);
student[i].avg = (student[i].kor + student[i].eng + student[i].math) / 3.0;
}
for(int i = 0; i < 3; i++)
{
printf("%s ", student[i].name);
printf("%.1f\n", student[i].avg);
}
return 0;
}
C
복사