728x90
구조체(Structure)
- 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입
- 기본 타입만으로는 나타낼 수 없는 복잡한 데이터를 표현할 수 있다.
- 멤버 변수 (member vaiable) : 구조체를 구성하는 변수
배열 🆚 구조체
- 배열 : 같은 타입의 변수 집합
- 구조체 : 다양한 타입의 변수 집합
구조체 정의와 선언
struct student {
int number;
char name[10];
double grade;
}; // 구조체 정의
int main(void){
struct student s1; // 구조체 변수 선언
...
}
이름 없는 구조체 선언
- 구조체를 정의할 때 태그 이름을 생략할 수 있다.
- 이 경우 구조체의 이름이 없으므로 구조체 변수를 구조체 정의와 함께 선언한다.
- 그러나 같은 구조체가 필요해서 태그가 없으므로 재사용이 불가하다!
구조체의 초기화
struct student {
int number;
char name[10];
double grade;
};
struct student s1 = {24, "kim", 4.3}; // 구조체 초기화
구조체 멤버 참조
- . 연산자를 사용하여 멤버에 접근한다!
Ex1. 구조체를 이용한 학생 정보 출력 프로그램
#include <stdio.h>
#include <string.h>
struct student
{
int number;
char name[10];
double grade;
};
int main(void)
{
struct student s;
s.number = 20190001;
strcpy(s.name, "김픠픠");
s.grade = 4.3;
printf("학번: %d\n", s.number);
printf("이름: %s\n", s.name);
printf("학점: %.1f\n", s.grade);
return 0;
}
Ex2. 점과 점 사이의 거리 계산 프로그램
#include <stdio.h>
#include <math.h>
struct point {
int x;
int y;
};
int main(void) {
struct point p1, p2;
int xdiff, ydiff;
double dist;
printf("점의 좌표를 입력하시오(x, y): ");
scanf("%d, %d", &p1.x, &p1.y);
printf("점의 좌표를 입력하시오(x, y): ");
scanf("%d, %d", &p2.x, &p2.y);
xdiff = p1.x - p2.x;
ydiff = p1.y - p2.y;
dist = sqrt((double)(xdiff * xdiff + ydiff * ydiff));
printf("두 점사이의 거리는 %f입니다.\n", dist);
return 0;
}
구조체를 멤버로 가지는 구조체
struct date { // 구조체 선언
int year;
int month;
int day;
};
struct student { // 구조체 선언
int number;
char name[10];
struct date dob; // 구조체 안에 구조체 포함
double grade;
};
struct student s1; // 구조체 변수 선언
s1.dob.year = 2021; // 멤버 참조
s1.dob.month = 06;
s1.dob.day = 21;
💡 구조체 속에 구조체를 멤버로 가질 수 있다!
└ 동일하게 . 연산자를 사용하여 접근한다
구조체 변수의 대입과 비교
#include <stdio.h>
struct point {
int x;
int y;
};
int main(void)
{
struct point p1 = {10, 20};
struct point p2 = {30, 40};
p2 = p1; // 대입 가능
if (p1 == p2) // ERROR 발생 !
printf("p1와 p2이 같습니다.");
if ((p1.x == p2.x) && (p1.y == p2.y)) // 올바른 비교
printf("p1와 p2이 같습니다.");
}
📢 구조체 변수에 구초체 대입은 가능하지만 비교는 불가하다!
💡 구조체 멤버끼리의 비교는 가능하다!
구조체 배열
: 구조체를 여러개 모은 것
struct student {
int number;
char name[20];
double grade;
};
int main(void)
{
struct student list[100]; // 구조체의 배열 선언
list[2].number = 24;
strcpy(list[2].name, "kim");
list[2].grade = 4.3;
}
Ex3. 구조체 배열을 이용한 학생 정보 출력 프로그램
#include <stdio.h>
struct student {
int number;
char name[20];
double grade;
};
int main(void) {
struct student list[3];
int x;
for(x = 0; x < 3; x++) {
printf("%d번 학생의 학번을 입력하시오 : ", x + 1);
scanf("%d", &list[x].number);
printf("%d번 학생의 이름을 입력하시오 : ", x + 1);
scanf("%s", list[x].name); // 멤버 변수가 배열이므로 '&'기호는 사용하지 않는다.
printf("%d번 학생의 학점을 입력하시오 : ", x + 1);
scanf("%lf", &list[x].grade);
}
for(x = 0; x< 3; x++)
printf("%d번. 학번 : %d, 이름 : %s, 학점 : %.1f\n", x + 1, list[x].number, list[x].name, list[x].grade);
return 0;
}
구조체와 포인터
- 구조체를 가리키는 포인터
- 포인터를 멤버로 가지는 구조체
구조체를 가리키는 포인터
#include <stdio.h>
struct student {
int number;
char name[20];
double grade;
};
int main(void)
{
struct student s = {20190001, "Kim", 4.3};
struct student *p;
p = &s;
printf("학번 = %d 이름 = %s 학점 = %.1f \n", s.number, s.name, s.grade);
printf("학번 = %d 이름 = %s 학점 = %.1f \n", (*p).number, (*p).name, (*p).grade);
return 0;
}
- -> 연산자를 사용하여 구조체 포인터로 구조체 멤버를 참조할 때 사용한다.
포인터를 멤버로 가지는 구조체
struct date {
int month;
int day;
int year;
};
struct student {
int number;
char name[20];
double grade;
struct date *dob;
};
int main(void) {
struct date d = { 6, 21, 2021 };
struct student s = { 20190001, "Kim", 4.3 };
s.dob = &d;
printf("학번: %d\n", s.number);
printf("이름: %s\n", s.name);
printf("학점: %f\n", s.grade);
printf("생년월일: %d년 %d월 %d일\n", s.dob->year, s.dob->month, s.dob->day);
return 0;
}
공용체(union)
union example {
char c;
int x;
};
- 같은 메모리 영역을 여러 개의 변수가 공유
- 공용체를 선언하고 사용하는 방법은 구조체와 비슷하다.
💡 구조체에 비해 메모리를 효율적으로 사용할 수 있다!
Ex4.
#include <stdio.h>
union example {
int i;
char c;
};
int main(void)
{
union example uni;
uni.c = 'A';
printf("uni.c:%c uni.i:%i\n", uni.c, uni.i );
uni.i = 10000;
printf("uni.c:%c uni.i:%i\n", uni.c, uni.i); // 각 메모리 공간이 개별적으로 인식
return 0;
}
열거형(enum)
- 변수가 가질 수 있는 값들을 미리 열거해놓은 자료형
- 오류를 줄이고 가독성을 높일 수 있다.
enum colors { white, red, blue, green, black };
enum boolean { false, true };
enum levels { low, medium, high };
enum car_types { sedan, suv, sports_car, van, pickup, convertible };
열거형의 초기화
enum days { SUN, MON, TUE, WED, THU, FRI, SAT }; // SUN=0, MON=1, ...
enum days { SUN=1, MON, TUE, WED, THU, FRI, SAT }; // SUN=1, MON=2, ...
enum days { SUN=7, MON=1, TUE, WED, THU, FRI, SAT=6 };// SUN=7, MON=1, ...
💡 값을 지정하지 않으면 0부터 할당된다!
Ex5.
#include <stdio.h>
enum days { SUN, MON, TUE, WED, THU, FRI, SAT };
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;
}
자료형 재정의(typedef)
- 기본 자료형에 새로운 자료형을 추가하는 것
구조체 재정의
struct point {
int x;
int y;
};
typedef struct point POINT;
POINT a, b;
전처리기 지시자(#define)
// #define 전처리기 지시자
#define Pi 3.14 // Pi : 매크로 상수
#define Swap(x, y) { int t; t=x; x=y; y=t; } // Swap : 매크로 함수
#define Square(x) x*x
#define P(x) printf("x = %d \n", x); // P(9);
#define PP(x) printf(#x “ = %d \n”, x); // PP(5 + 7);
💡 일종의 매크로이다!
아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!
수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑
개발 환경
작성 플랫폼
728x90
'🧑💻 Language > C·C++' 카테고리의 다른 글
[C++] 시스템 소프트웨어 개발 (1) | 2022.05.20 |
---|---|
[C 이론] 16. 파일 입출력 (1) | 2021.06.22 |
[C 이론] 15. 표준 입출력 (0) | 2021.06.22 |
[C 이론] 14. 문자와 문자열(2) (0) | 2021.06.05 |
[C 이론] 13. 문자와 문자열(1) (0) | 2021.06.05 |