[C언어] 구조체

yunssup·2023년 6월 13일
0

C언어

목록 보기
13/13
post-thumbnail

1. 구조체 선언

struct student{
	int number;
    char name[10];
    double grade;
}

struct : 구조체 정의 키워드
struct student : 구조체의 이름 (태그)
int number;
char name[10];
double grade; : 구조체의 멤버

구조체 정의(선언)와 구조체의 변수 선언은 다름

struct student
{
	int number;
    char name[10];
    double grade;
}

= 구조체 정의

int main (void)
{
	struct student s1;
}

= 구조체 변수 선언

2. 구조체의 변수 선언

  • 중괄호를 이용하여 초기값을 나열
struct student
{
	int number;
    char name[10];
    double grade;
};
struct student s1={24,"KIM",4.3};

3. 구조체 멤버 접근

s1.grade = 3.8;

s1 = 구조체 변수
grade = 구조체 멤버

예제 1)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>
#include <string.h>

struct student
{
	int number; 
	char name[10];
	double grade;
}; /*구조체 선언*/

int main(void) {
	struct student s;

	s.number = 2021111263;
	strcpy(s.name, "홍길동");
	s.grade = 4.3;

	printf("학번 : %d\n", s.number);
	printf("이름 : %s\n", s.name);
	printf("학점 : %f\n", s.grade);
	
	return 0;
}

예제 2)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>
#include <string.h>

struct student
{
	int number; 
	char name[10];
	double grade;
}; /*구조체 선언*/

int main(void) {
	struct student s;

	printf("학번을 입력하시오 : ");
	scanf("%d", &s.number);
	printf("이름을 입력하시오 : ");
	scanf("%s", &s.name);
	printf("학점을 입력하시오 : ");
	scanf("%lf", &s.grade);

	printf("학번 : %d\n", s.number);
	printf("이름 : %s\n", s.name);
	printf("학점 : %f\n", s.grade);
	
	return 0;
}

4. 구조체 변수의 대입과 비교

  • 같은 구조체 변수끼리 대입은 가능, 비교는 불가능

5. 구조체 배열과 배열의 초기화

예제)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#define SIZE 3

struct student {
	int number;
	char name[20];
	double grade;
};
int main(void)
{
	struct student list[SIZE];
	int i;
	for (i = 0; i < SIZE; i++)
	{
		printf("학번을 입력하시오: ");
		scanf("%d", &list[i].number);
		printf("이름을 입력하시오: ");
		scanf("%s", list[i].name);
		printf("학점을 입력하시오(실수): ");
		scanf("%lf", &list[i].grade);
	}
	for (i = 0; i < SIZE; i++)
		printf("학번: %d, 이름: %s,  학점: %f\n", list[i].number, list[i].name, list[i].grade);
	return 0;
}

6. 구조체를 가리키는 포인터

예제)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#define SIZE 3

struct student {
	int number;
	char name[20];
	double grade;
};
int main(void)
{
	struct student s = { 24,"KIM", 4.3};
	struct student* p;
	p = &s;
	printf("학번=%d 이름=%s 학점=%f \n", s.number, s.name, s.grade);
	printf("학번=%d 이름=%s 학점=%f \n", (*p).number, (*p).name, (*p).grade);
}

7. -> 연산자

  • ->연산자는 구조체 포인터로 구조체 멤버 참조 시 사용
  1. (*p).number
  2. p->number
    = p가 가리키는 구조체 변수의 number
    예제)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <stdio.h>
struct student {
	int number;
	char name[20];
	double grade;
};
int main(void)
{
	struct student s = { 123456789, "홍길동", 4.3 };
	struct student* p;
	p = &s;
	printf("학번=%d 이름=%s 학점=%f \n", s.number, s.name, s.grade);
	printf("학번=%d 이름=%s 학점=%f \n", (*p).number, (*p).name, (*p).grade);
	printf("학번=%d 이름=%s 학점=%f \n", p->number, p->name, p->grade);
	return 0;
}

8. 구조체와 함수

  • 구조체를 함수의 인수로 전달하는 경우, 구조체이 복사본이 함수로 전달
  • 구조체의 포인터를 함수의 인수로 전달하는 경우, 시간과 공간을 절약하지만 원본 훼손 가능성
  • 구조체를 반환하는 경우, 복사본이 반환

9. 공용체

  • 같은 메모리 영역을 여러개의 변수가 공유
  • 구조체와 비슷
    union example {
    	char c;
        int i;
    }

10. 열거형

  • 변수가 가질 수 있는 값들을 미리 열거해놓은 자료형
    enum days {SUN,MON,TUE};

enum = 열거형 정의 시 사용하는 키워드
days = 열거형 이름 (태그)
예제)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 

enum days {SUN, MON, TUE, WED, THU, FRI, SAT};
const char* days_name[] = { "sunday", "monday", "tuesday", "wednesday",
"thursday", "friday", "saturday" };

int main(void) {
	enum days d;
	d = WED;
	printf("%d번째 요일은 %s입니다\n", d, days_name[d]);
	return 0;
}

11. typedof

  • 기본 자료형에 새로운 자료형을 추가하는 것
    typedof unsigned char BYTE;

typedof = 새로운 자료형 BYTE로 정의
unsigned char = 기존의 자료형
BYTE = 새로운 자료형

0개의 댓글

관련 채용 정보