구조체(Structure Type)

한준수·2023년 6월 15일
0

C-Lang

목록 보기
7/12

📖 구조체의 개념

구조체란 비빔밥 처럼 서로 다른 변수의 형태를 하나의 블록으로 묶어둔 것과 같다.

📌 구조체 문법

  • 멤버 변수 : 구조체 안에서 정의된 변수를 뜻하며 일반적인 변수 선언과 동일한 방법으로 선언한다.
    • 위 그림에선 a, b, c, d[5] 가 멤버 변수에 해당한다.

📌 구조체 변수의 초기값 대입

struct student{
	char name[10];
    int kor;
    int eng;
    float avg;
};

struct student s = {"Woo", 90, 80};

구조체 변수를 초기화 할 때는 중괄호 { } 안에 초기값을 콤마로 분리해서 대입한다.

⌨ 구조체 사용 예시

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

void main(){
	struct bibim{
    	int a;
        float b;
        char c;
        char d[5];
    };
    
    struct bibim b1;
    
    b1.a = 10;
    b1.b = 1.1f;
    b1.c = 'A';
    strcpy(b1.d, "ABCD");
    
    printf("b1.a ==> %d \n", b1.a);
    printf("b1.b ==> %f \n", b1.b);
    printf("b1.c ==> %c \n", b1.c);
    printf("b1.d ==> %s \n", b1.d);
}

💻 출력 결과


📖 구조체 배열

⌨ 구조체 배열 예제

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

void main(){
	struct student{
    	char name[10];
        int kor;
    	int eng;
    	float avg;
    };
    
    struct student s[3];
    
    int i;
    
    strcpy(s[0].name, "Kim");
    s[0].kor = 90;
    s[0].eng = 80;
    s[0].avg = (s[0].kor + s[0].eng) / 2.0f;
    
    strcpy(s[1].name, "Lee");
    s[1].kor = 70;
    s[1].eng = 60;
    s[1].avg = (s[1].kor + s[1].eng) / 2.0f;
    
    strcpy(s[2].name, "Park");
    s[2].kor = 90;
    s[2].eng = 80;
    s[2].avg = (s[2].kor + s[2].eng) / 2.0f;
    
    printf("--구조체 배열--");
    for(i = 0; i < 3; i++){
    	printf("학생 이름 ==> %s\n",s[i].name);
        printf("국어 점수 ==> %d\n",s[i].kor);
        printf("영어 점수 ==> %d\n",s[i].eng);
        printf("평균 점수 ==> %5.1f\n",s[i].avg);
        
        printf("\n");
    }
}

📖 구조체 포인터


구조체 포인터 변수도 구조체의 주소를 가지고 있다.

다른점이라고 하면
구조체 포인터가 가리키는 곳에 값을 할당해주기 위해서는 ' -> ' 화살표 연산자를 사용하여 값을 할당한다.

📌 구조체 포인터를 선언하고 메모리 할당하기

구조체 포인터를 생성할 때는 인반 포인터 변수를 생성할 때와 동일하게 * 참조 연산자를 생성 시에 변수명 앞에 위치시키면 된다.

Heap 영역에 필요한 칸큼 구조체의 크기만큼 생성을 할 때는 일반 포인터와 동일하게 malloc() 함수를 사용하면 된다

⌨ 구조체 포인터 malloc() 형식

struct 구조체_이름 *포인터_이름 = malloc(sizeof(struct 구조체_이름));

⌨ 구조체 포인터 사용 예제

#include<stdio.h>

void main(){
	struct student{
    	char name[10];
        int kor;
    	int eng;
    	float avg;
    };
    
    struct student s;
    struct student *p;
    
    p = &s;
    
    printf("이름 입력 : ");
    scanf("%s", p->name);
    
    printf("국어 점수");
    scanf("%d", &p->kor);
    
    printf("영어 점수");
    scanf("%d", &p->eng);
    
    p->avg = (p->kor + p->eng);
    
    printf("\n --- 구조체 포인터 활용 ---\n");
    
    printf("학생 이름 ==> %s\n", p->name);
    printf("국어 점수 ==> %d\n", p->kor);
    printf("영어 점수 ==> %d\n", p->eng);
    printf("국어 점수 ==> %5.1f\n", p->avg);
}

📃 퀴즈

  • 구조체 포인터와 메모리 할당 함수(malloc)를 이용하여 학생의 이름과 나이를 입력 받아 출력하는 프로그램을 작성하시오

  • 실행결과

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

void main(){
	struct student{
    	char name[10];
        int age;
    };
    
    int count;
    printf("입력할 학생 수 : ");
    scanf("%d", &count);
    struct student *p;
    struct student s;
    p = (struct student*) malloc(sizeof(s) * count);
    
   
    
    for(int i = 0; i < count; i++){
    	printf("이름과 나이 입력 : ");
        scanf("%s %d", p[i].name, &p[i].age);
    }
    
    for(int i = 0; i < count; i++){
    	printf("이름 : %s , 나이 : %d \n",p[i].name, p[i].age);
    }
}

0개의 댓글