프로그래밍/C

[C언어] 11. 구조체(Structure) (구조체와 배열, 구조체와 포인터)

록스타★ 2024. 10. 24. 14:26
반응형

1. 구조체

- 구조체는 서로 다른 데이터 타입의 변수를 하나로 묶어 사용할 수 있게 해주는 사용자 정의 데이터 타입

- 관련된 정보를 하나의 그룹으로 묶고자 할 때 유용

- 학생의 이름, 나이, 성적과 같은 정보를 저장할 때, 이 정보를각각의 변수로 저장하는 대신 하나의 구조체로 묶어 관리

 

 

2. 구조체 선언

- 구조체를 선언하려면 struct 키워드를 사용한 후, 구조체의 정의를 작성

- Student라는 구조체를 선언

 > 이름(name), 나이(age), 성적(grade)을 하나의 데이터로 묶어서 관리

    struct Student {
    char name[50];  // 학생 이름
    int age;        // 학생 나이
    float grade;    // 학생 성적
};

 

 

 

3. 구조체 변수 선언 및 사용

- 구조체 변수를 선언할 때는 struct 키워드 사용

- student1이라는 변수를 통해 구조체의 각 멤버에 접근

struct Student student1;

 

 

구조체 예제

#include <stdio.h>

struct Student {
    char name[50];
    int age;
    float grade;
};

int main() {
    struct Student student1;

    // 값 할당
    strcpy(student1.name, "김철수");
    student1.age = 20;
    student1.grade = 3.8;

    // 값 출력
    printf("이름: %s\n", student1.name);
    printf("나이: %d\n", student1.age);
    printf("성적: %.2f\n", student1.grade);

    return 0;
}

 

 

출력 

이름: 김철수
나이: 20
성적: 3.80

 

 

 

4. 구조체 배열

- 여러 개의 구조체 변수를 한 번에 관리하고 싶다면, 구조체 배열을 사용 가능

- 여러 명의 학생 정보를 배열로 저장

struct Student students[3];

 

구조체 배열 예시

#include <stdio.h>
#include <string.h>

struct Student {
    char name[50];
    int age;
    float grade;
};

int main() {
    struct Student students[3];

    // 첫 번째 학생 정보 입력
    strcpy(students[0].name, "김영희");
    students[0].age = 21;
    students[0].grade = 3.7;

    // 두 번째 학생 정보 입력
    strcpy(students[1].name, "박민수");
    students[1].age = 22;
    students[1].grade = 3.5;

    // 세 번째 학생 정보 입력
    strcpy(students[2].name, "이준호");
    students[2].age = 23;
    students[2].grade = 3.9;

    // 학생 정보 출력
    for (int i = 0; i < 3; i++) {
        printf("학생 %d 정보\n", i + 1);
        printf("이름: %s\n", students[i].name);
        printf("나이: %d\n", students[i].age);
        printf("성적: %.2f\n\n", students[i].grade);
    }

    return 0;
}

 

출력

학생 1 정보
이름: 김영희
나이: 20
성적: 3.80

학생 2 정보
이름: 박민수
나이: 22
성적: 3.5

학생 3 정보
이름: 이준호
나이: 23
성적: 3.9

 

 

 

5. 구조체와 포인터

- 구조체 포인터를 사용하면, 구조체를 직접 참조하는 대신 주소를 통해 구조체를 가리킬 수 있다.

- 구조체 포인터는 메모리 효율적인 방법으로 대용량 데이터를 처리할 때 유용

- 구조체 포인터를 선언하려면 struct 키워드를 사용하고 포인터 변수 이름 앞에 *를 붙임

struct Student *ptr;

  

 

구조체와 포인터 예시

- 구조체 포인터를 통해 student1의 멤버에 값을 할당하고 출력

- ptr->name처럼 -> 연산자를 사용하여 구조체 멤버에 접

#include <stdio.h>
#include <string.h>

struct Student {
    char name[50];
    int age;
    float grade;
};

int main() {
    struct Student student1;
    struct Student *ptr;

    // 구조체 포인터에 주소 할당
    ptr = &student1;

    // 구조체 포인터를 사용한 값 할당
    strcpy(ptr->name, "최지은");
    ptr->age = 24;
    ptr->grade = 3.6;

    // 값 출력
    printf("이름: %s\n", ptr->name);
    printf("나이: %d\n", ptr->age);
    printf("성적: %.2f\n", ptr->grade);

    return 0;
}

 

출력

이름: 최지은
나이: 24
성적: 3.60

 

 

 

결론

구조체는 관련된 데이터를 하나로 묶어 관리할 수 있고, 포인터와 함께 사용하면 메모리에 효율성을 높인다.

파일 처리나 동적 메모리 할당에서 유용하며, 확실히 이해하자!

 

 

반응형