구조체

C언어 2020. 12. 8. 23:29

구조체

- 여러 개의 변수를 묶어 하나의 객체를 표현하고자 할 때 구조체를 사용할 수 있음(배열과는 성질이 다름)

- 캐릭터, 몬스터, 학생, 좌표 등 다양한 객체를 모두 프로그래밍 언어를 이용해 표현할 수 있음

 

구조체의 정의와 선언

struct 구조체명 {

   자료형 1 변수명 1;

   자료형 2 변수명 2;

   ...

};

 

* 한 명의 학생에 대한 정보를 담고 있는 구조체

#include <stdio.h>

struct Student {
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
};

 

구조체의 변수의 선언과 접근

- 기본적으로 구조체의 변수에 접근할 때는 온점(.)을 사용함

int main(void){
    struct Student s; // 구조체 변수 선언
    strcpy(s.studentId, "20201208"); // 구조체 변수에 접근
    strcpy(s.name, "khon");
    s.grade = 4;
    strcpy(s.major, "컴퓨터교육");
}

 

*학생 구조체를 만들어서 활용하기

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

struct Student { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
};

int main(void){
    struct Student s; // 구조체 변수 선언
    strcpy(s.studentId, "20201208"); // 구조체 변수에 접근
    strcpy(s.name, "khon");
    s.grade = 4;
    strcpy(s.major, "컴퓨터교육");
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

구조체의 정의와 선언

- 하나의 구조체 변수만 사용하는 경우 정의와 동시에 선언을 할 수도 있음

- 이 경우 변수는 전역 변수로 사용됨

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

struct Student { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} s; // 전역 변수

int main(void){
    strcpy(s.studentId, "20201208"); // 구조체 변수에 접근
    strcpy(s.name, "khon");
    s.grade = 4;
    strcpy(s.major, "컴퓨터교육");
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

구조체의 초기화

1.

- 구조체의 변수를 한 번에 초기화하기 위해서는 중괄호에 차례대로 변수의 값을 넣음

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

struct Student { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} s; // 전역 변수

int main(void){
    struct Student s = { "20201208", "khon", 4, "컴퓨터교육"};
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

2.

- 위쪽에서 구조체를 정의하고 선언하면서 그와 동시에 초기화까지 할 수 있음

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

struct Student { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} s = { "20201208", "khon", 4, "컴퓨터교육"};

int main(void){
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

더 짧게 구조체 정의하기

1.

- typedef 키워드를 이용하면 임의의 자료형을 만들 수 있으므로 선언이 더 짧아짐

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

typedef struct Student { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} Student;

int main(void){
    Student s = {"20201208", "khon", 4, "컴퓨터교육"};
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

2.

- 최근에는 익명 구조체의 개념이 등장하여 구조체 이름 부분을 비워놔도 됨

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

typedef struct { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} Student;

int main(void){
    Student s = {"20201208", "khon", 4, "컴퓨터교육"};
    printf("학번: %s\n", s.studentId); // 구조체 내용 출력
    printf("이름: %s\n", s.name);
    printf("학년: %d\n", s.grade);
    printf("학과: %s\n", s.major);
    system("pause");
    return 0;
}

 

구조체 포인터 변수에 접근하기

- 구조체가 포인터 변수로 사용되는 경우 내부 변수에 접근할 때 화살표(->) 를 사용함

#include <stdio.h>
#include <stdlib.h>
#include <string.h> // strcpy를 사용하기 위한 헤더

typedef struct { // 학생 구조체 정의
    char studentId[10];
    char name[10];
    int grade;
    char major[100];
} Student;

int main(void){
    Student *s = malloc(sizeof(Student));
    strcpy(s -> studentId, "20201208"); // 구조체 포인터 변수에 접근
    strcpy(s -> name, "khon");
    s -> grade = 4;
    strcpy(s -> major, "컴퓨터교육");
    printf("학번: %s\n", s -> studentId); // 구조체 내용 출력
    printf("이름: %s\n", s -> name);
    printf("학년: %d\n", s -> grade);
    printf("학과: %s\n", s -> major);
    system("pause");
    return 0;
}

 

 

- 구조체는 현실 세계의 객체를 소스코드 상에서 매우 쉽게 표현할 수 있도록 해줌

'C언어' 카테고리의 다른 글

전처리기  (0) 2020.12.09
파일 입출력  (0) 2020.12.08
함수 포인터  (0) 2020.12.08
동적 메모리 할당  (0) 2020.12.08
다차원 배열과 포인터 배열  (0) 2020.12.07
Posted by khon98
,