반응형
구조체 (struct) - 사용자 정의 자료형(type)
- 다양한 타입의 변수들을 묶은 자료형
> 배열 : '같은 타입' 변수들의 나열
> 구조체 : '여러 타입' 변수들의 나열
- 구조체는 미리 선언하고 사용한다.
> 함수 선언부 위 (함수 원형에서 사용할 수 있기 때문)
> 구조체 선언 = 새로운 자료형 만들었다.
- 구조체 멤버로 배열, 포인터, 다른 구조체 등도 사용할 수 있다.
> 변수화 가능한 모든 것
- 구조체 변수는 멤버들을 묶은 '단위'이다.
> 일반 변수처럼 사용할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | #include <stdio.h> #include <string.h> // (1) 구조체의 기본 선언 struct STUDENT { // 구조체가 가질 멤버 선언 char szName[20]; // 학생 이름 int iAge; // 학생 나이 double dGrade; // 학생 점수 // 구조체 멤버 선언 시에는 초기화를 할 수 없다. // 이때는 공간이 만들어지는게 아님 (이런 자료형이 있다고 선언만 할 뿐) // 구조체를 이용해서 변수를 만들 때, 공간이 생성, 그때 초기화 진행 }; // (2) typedef 를 이용한 struct 글자 떼기 typedef struct _EMPLOYEE // _EMPLOYEE 사용하지 않을 이름이라서 그냥 _ 붙임 (필수 아님) { char szName[20]; // 사원 이름 int iAge; // 사원 나이 int iSalary; // 사원 월급 } EMPLOYEE; //typedef //struct _EMPLOYEE { char szName[20]; int iAge; int iSalary; } //EMPLOYEE; typedef int KOREAIS_INT; // int 를 KOREAIS_INT 이름으로 사용할 수 있게 정의하겠다! // 이 이후부터는 KOREAIS_INT 는 int와 같다. KOREAIS_INT iNum = 0; == int iNum = 0; void main() { // (1) 구조체를 사용하면 학생 10명일 때, 구조체 변수 10개면 된다. struct STUDENT sKim1; // STUDENT 자료형으로 만든 변수 (초기화 되지 않음) struct STUDENT sKim2 = {0, }; // 초기화 (배열과 동일) struct STUDENT sLee = { "이몽룡", 20, 99.9 }; // 멤버 타입 순서에 맞게 초기값 // (2) 구조체를 사용하지 않았다면, 각각의 변수를 10개씩 만들어야된다.. (이래서 구조체사용) char szName1[20]; // 학생 이름 int iAge1; // 학생 나이 double dGrade1; // 학생 점수 char szName2[20]; // 학생 이름 int iAge2; // 학생 나이 double dGrade2; // 학생 점수 // (3) typedef를 이용한 sturct 떼기 EMPLOYEE sHong = {0, }; // <-- 구조체 다룰 때 가장 베스트! (typedef사용, 0 초기화) struct _EMPLOYEE sHong2 = {0, }; // _EMPLOYEE를 사용할 수는 있음. EMPLOYEE * pHong = NULL; // 구조체는 단지 자료형이기 때문에, 포인터변수도 생성 가능 pHong = &sHong; // 앞서 배운 포인터 개념과 동일. 자료형(type)만 바꼈을 뿐. // 구조체 변수명에서 점(.)을 붙이면 구조체 멤버를 접근(사용)할 수 있다. sHong.iAge = 20; sHong.iSalary = 2000000; // sHong.szName = "홍길동"; // szName은 문자'배열' -> 배열은 변경 불가 strcpy(sHong.szName, "홍길동"); // string.h 필요 printf("이름 : %s\n", sHong.szName); printf("나이 : %d세\n", sHong.iAge); printf("월급 : %d원\n", sHong.iSalary); // 구조체의 포인터 변수로 멤버를 접근할 때는 점(.) 대신 -> 사용 pHong->iAge = 21; // sHong 구조체를 따라가서 멤버를 사용! pHong->iSalary = 2500000; printf("이름 : %s\n", pHong->szName); printf("나이 : %d세\n", (*pHong).iAge); // *pHong = sHong과 같기 때문에 점(.) 사용 printf("월급 : %d원\n", sHong.iSalary); // 함수 안에서 함수 외부의 구조체를 접근할 때 포인터 변수를 사용, 이때 -> 사용 { int iAge = 0; int iArr[5] = { 0 }; EMPLOYEE sHan = {0, }; EMPLOYEE sArr[5] = {0, }; iAge = 20; iArr[0] = 20; sHan.iAge = 20; sArr[0].iAge = 20; printf("iAge = %d\n", iAge); printf("iArr[0] = %d\n", iArr[0]); printf("sHan.iAge = %d\n", sHan.iAge); scanf("%d", &iAge); scanf("%d", &iArr[0]); scanf("%d", &sHan.iAge); } } | cs |
반응형
'C > C언어 이론' 카테고리의 다른 글
| (2-1)Data type (0) | 2018.10.02 |
|---|---|
| (10)MemoryAllocation (0) | 2018.06.20 |
| (8)Pointer (0) | 2018.06.20 |
| (7)Array (0) | 2018.06.20 |
| (6)Function (0) | 2018.06.20 |