Search

구조체

언어
C
태그
구조체

선언

#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
복사