Presentation is loading. Please wait.

Presentation is loading. Please wait.

C언어: 구조체 (Structures).

Similar presentations


Presentation on theme: "C언어: 구조체 (Structures)."— Presentation transcript:

1 C언어: 구조체 (Structures)

2 구조체란? 여러 변수들을 하나로 묶어 자료를 관리하기 쉽도록 고안된 개념
데이터의 처리가 많은 경우 구조체를 사용함으로써 복잡한 자료를 다루는데 커다란 이점이 있다.

3 구조체와 배열의 차이

4 구조체의 선언 방법 구조체를 선언하는 것도 일반 변수를 선언하는 것과 크게 다르지 않음 struct 키워드를 활용

5 구조체의 선언 방법 예

6 구조체의 사용방법 선언된 구조체를 사용할 때는 일반 변수와 같이 구조체의 태그명과 사용할 구조체의 변수명을 소스 코드 내부에 선언

7 구조체의 사용 예 roll_book 구조체를 프로그램 내부에서 선언한 예

8 구조체의 멤버를 읽고 쓰는 방법 구조체의 변수를 선언했다면, 구조체의 변수에 값을 쓰고 읽을 수 있다.

9 구조체 멤버에 값을 쓰는 방법의 예 roll_book 구조체의 rollA 구조체 변수의 멤버 id에 10이란 값을 쓰는 예

10 구조체 선언과 동시에 변수 생성 방법

11 구조체를 선언함과 동시에 변수를 생성한 예

12 구조체와 메모리

13 잘못된 구조체의 초기화

14 구조체의 생성과 변수의 선언을 동시에 할 때

15 별도로 구조체 변수를 선언할 때

16 2개 이상의 구조체 변수를 사용할 때 2개 이상의 구조체 변수를 선언할 때는 각 구조체 변수별로 콤마(,)로 구분한다.

17 2개 이상의 구조체 변수를 사용할 때의 예

18 예제 10-1 간단한 구조체 선언과 멤버 읽고 쓰기 프로그램
rollA의 멤버 number의 값을 바꾼 뒤 바뀐 값을 확인하기 위해 그 값을 화면에 출력하는 프로그램을 작성

19 예제 10-1 간단한 구조체 선언과 멤버 읽고 쓰기 프로그램
// C_EXAMPLE\ch10\ch10_project1\simplestruct.c #include <stdio.h> // 구조체 선언 struct roll_book{ char id; char name[10]; int number; }rollA = {1, "JoeyLee", 18}; // 구조체 선언과 구조체 변수 동시 선언 및 초기화 void main(void) { struct roll_book rollB = {2, "Jane", 19}; // 새로운 구조체 변수 선언 // 두 개의 구조체 멤버 출력 printf("%d %-8s %d \n", rollA.id, rollA.name, rollA.number); printf("%d %-8s %d \n", rollB.id, rollB.name, rollB.number); // 구조체 rollA의 number를 변경 rollA.number = 20; printf("변경된 %s의 번호는 %d \n", rollA.name, rollA.number); } // main() 구조체의 몸체 선언 구조체를 선언함과 동시에 변수선언 후 초기화 또 다른 구조체변수 rollB 선언 구조체의 멤버를 참조하기 위해서는 구조체 멤버 연산자를 사용 구조체의 멤버값을 변경함

20 예제 10-1 간단한 구조체 선언과 멤버 읽고 쓰기 프로그램 id name number 변경된 rollA의 number 값

21 구조체 배열이란? 구조체 배열은 구조체 자체를 배열로 만들어 여러 개의 그룹자료를 관리할 때 사용하면 굉장히 편리한 개념이다.

22 구조체 배열의 선언과 동시에 초기화 하는 방법

23 구조체 선언 후 별도로 배열을 선언하는 경우

24 구조체 배열의 멤버를 읽고 쓰는 방법 일반 변수의 배열의 원소를 가리키는 것과 같이 구조체 배열도 하나의 배열 변수로 간주하고 멤버를 참조 할 수 있다.

25 구조체 배열의 멤버를 읽고 쓰는 예

26 예제 10-2 구조체 배열의 간단한 프로그램 S라는 구조체를 작성한다. 이 구조체에 대한 변수 3개를 배열로 선언하고 각 멤버를 초기화 한 뒤 화면에 각각의 멤버값을 출력하는 프로그램을 작성한다.

27 예제 10-2 구조체 배열의 간단한 프로그램 // C_EXAMPLE\ch10\ch10_project2\structarray.c
#include <stdio.h> // 구조체 배열 선언 struct S { char id; char name[10]; int score; }; 구조체 S를 선언하고 멤버는 3개이다.

28 예제 10-2 구조체 배열의 간단한 프로그램 void main(void) { // 3개의 구조체 배열 선언
struct S S1[3]={{1, "Joey", 99}, {2, "Jane", 50}, {3, "Nick", 90} }; int i; printf("번호 이름 점수 \n"); // 제목줄 표시 // 루프를 돌며 각 구조체의 멤버들을 한 줄씩 출력 for(i = 0; i < 3; i++) printf("%4d %4s %4d\n", S1[i].id, S1[i].name, S1[i].score); } // for } // main() 구조체 배열을 선언하고, 각 배열의 멤버를 초기화함 S1[0] S1[1] S1[2] S1[n].멤버변수의 형식으로 작성

29 예제 10-2 구조체 배열의 간단한 프로그램 S1[0].id S1[1].name S1[2].score

30 구조체 포인터란? 일반적인 변수의 경우에 이 변수가 위치하고 있는 메모리의 주소값을 담을 수 있는 포인터가 존재하듯이, 구조체도 구조체 변수가 위치하고 있는 메모리의 주소값을 담을 수 있는 구조체 포인터가 존재한다.

31 구조체 포인터의 선언 방법

32 구조체 포인터의 멤버에 읽고 쓰는 방법 구조체 포인터의 경우에는 구조체 멤버 연산자(.)를 사용하지 않고, 화살표(->) 기호를 사용하여 구조체의 멤버에 접근할 수 있다.

33 구조체 배열로 선언된 구조체를 구조체 포인터를 사용하여 표시하는 프로그램
예제 10-3 구조체 배열로 선언된 구조체를 구조체 포인터를 사용하여 표시하는 프로그램 이 구조체에 대한 변수 s1 3개를 배열로 선언하고 각 멤버를 초기화한 뒤 화면에 각각의 멤버값을 출력하는 프로그램을 작성

34 예제 10-3 구조체 배열로 선언된 구조체를 구조체 포인터를 사용하여 표시하는 프로그램
// C_EXAMPLE\ch10\ch10_project3\structpointer.c #include <stdio.h> // 3개의 구조체 배열 선언 struct S { char id; char name[10]; int score; }s1[3] = {{1, "Joey", 99}, {2, "Jane", 50}, {3, "Nick", 90} };

35 예제 10-3 구조체 배열로 선언된 구조체를 구조체 포인터를 사용하여 표시하는 프로그램 void main(void) {
struct S *p = s1; // 구조체 포인터 선언 및 s1의 주소 대입 int i; printf("번호 이름 점수 번호 이름 점수\n"); // 제목줄 표시 // 구조체 변수를 활용하여 멤버 출력 for(i = 0; i < 3; i++, *p++) printf("%4d %4s %4d", s1[i].id, s1[i].name, s1[i].score); printf(" %4d %4s %4d\n", p->id, p->name, p->score); } // for } // main() 배열명은 주소값이므로 주소를 구조체 포인터에 저장 struct *P 라고 작성하지 않음에 주의 구조체 s1의 주소를 증가시켜 구조체 배열의 원소에 접근 *p를 하나씩 증가시킬 때마다 s[1], s[2]를 가리킨다. 구조체 포인터인 경우에는 . 대신에 -> 기호를 사용하여 멤버에 접근한다.

36 예제 10-3 구조체 배열로 선언된 구조체를 구조체 포인터를 사용하여 표시하는 프로그램 s1[i].멤버에 의한 출력
p->멤버에 의한 출력

37 구조체 멤버를 함수의 인수로 전달하는 방법 구조체의 복사본이 함수 내의 인수로 사용
값에 의한 호출이 되어 새로운 복사본이 생성되어 함수 내에서 구조체를 변경해도 원본 구조체는 변동이 없다.

38 구조체 멤버를 함수의 인수로 넘겨주어 출력하는 프로그램
예제 10-4 구조체 멤버를 함수의 인수로 넘겨주어 출력하는 프로그램 Student라는 구조체를 작성하고 이 구조체에 대한 변수 s1, s2 2개를 선언한다. 구조체 멤버를 함수를 호출할 때 인수로 넘겨주는 프로그램을 작성

39 예제 10-4 구조체 멤버를 함수의 인수로 넘겨주어 출력하는 프로그램
// C_EXAMPLE\ch10\ch10_project4\structfunction1.c #include <stdio.h> // Student 구조체 선언 struct Student { char id; char name[10]; }; // 함수원형선언 void print(int id, char *name);  구조체 멤버 2개를 인수로 하는 함수

40 예제 10-4 구조체 멤버를 함수의 인수로 넘겨주어 출력하는 프로그램 void main(void) {
struct Student s1 = {1, "학생1"}; struct Student s2 = {2, "학생2"}; // print() 함수호출 print(s1.id, s1.name); print(s2.id, s2.name); } // main() // 함수정의 void print(int id, char *name) printf("id = %d, name = %s \n", id, name); } // print() 구조체의 멤버를 함수호출시 인수로 넘김

41 예제 10-4 구조체 멤버를 함수의 인수로 넘겨주어 출력하는 프로그램 s1의 멤버 출력 s2의 멤버 출력

42 구조체 전체를 함수의 인수로 넘겨주어 2개의 구조체를 교환하는 프로그램
예제 10-5 구조체 전체를 함수의 인수로 넘겨주어 2개의 구조체를 교환하는 프로그램 구조체에 대한 변수 s1, s2 각 2개를 선언하고 2개의 구조체를 교환하는 함수를 작성한 뒤에 교체 전, 함수의 인수로 사용된 교환 후의 구조체, s1, s2의 값을 출력하는 프로그램을 작성

43 예제 10-5 구조체 전체를 함수의 인수로 넘겨주어 2개의 구조체를 교환하는 프로그램
// C_EXAMPLE\ch10\ch10_project5\structfunction2.c #include <stdio.h> // Student 구조체 선언 struct Student { char id; char name[10]; }; // 함수원형선언 void exchange(struct Student arg1, struct Student arg2); void main(void) struct Student s1 = {1, "학생1"}; struct Student s2 = {2, "학생2"}; 구조체 선언 구조체 2개를 인수로 하는 함수 2개의 구조체 변수 선언

44 예제 10-5 구조체 전체를 함수의 인수로 넘겨주어 2개의 구조체를 교환하는 프로그램 // 교환되기 전의 구조체 값
printf("s1 = %d, %s , s2 = %d, %s \n", s1.id, s1.name, s2.id, s2.name); // exchange() 함수호출 exchange(s1, s2); // 교환된 후의 구조체 값 } // main() // 함수정의 void exchange(struct Student a1, struct Student a2) { struct Student temp; // 임시 구조체 변수 선언 temp = a1; a1 = a2; a2 = temp; printf("a1 = %d, %s , a2 = %d, %s \n", a1.id, a1.name, a2.id, a2.name); } // exchange() 구조체 전체를 함수호출시 인수로 넘김 exchange() 함수를 호출한 뒤 2개의 구조체를 확인 임시 구조체 temp를 사용하여, 2개의 구조체를 각각 바꾸는 함수정의 복사된 a1과 a2 구조체, 함수가 종료되면 소멸됨 a1과 a2는 서로 교환됨

45 exchange() 함수가 호출 된 후의 s1,s2의 값
예제 10-5 구조체 전체를 함수의 인수로 넘겨주어 2개의 구조체를 교환하는 프로그램 exchange() 함수호출 전 s1, s2의 값 함수 내의 인수 복사본 a1과 a2의 교환된 값 exchange() 함수가 호출 된 후의 s1,s2의 값

46 구조체 주소를 함수의 인수로 넘겨주는 프로그램
예제 10-6 구조체 주소를 함수의 인수로 넘겨주는 프로그램 구조체에 대한 변수 s1을 선언하고 각 구조체의 멤버를 변경하는 함수를 작성한다.

47 예제 10-6 구조체 주소를 함수의 인수로 넘겨주는 프로그램
// C_EXAMPLE\ch10\ch10_project6\structfunction3.c #include <stdio.h> #include <string.h> // Student 구조체 선언 struct Student { char id; char name[10]; }s1 = {1, "Joey"}; // 함수원형선언 void change(struct Student *arg); strcpy() 라이브러리 함수를 사용하기 위해 추가 구조체 선언과 동시에 초기화 구조체 포인터를 인수로 하는 함수원형선언

48 예제 10-6 구조체 주소를 함수의 인수로 넘겨주는 프로그램 void main(void) { // 바뀌기 전의 구조체 값
printf("s1 = %3d, %s \n", s1.id, s1.name); // change() 함수호출 change(&s1); // 바뀐 후의 구조체 값 } // main() // change() 함수정의 void change(struct Student *arg) arg->id = 100; strcpy(arg->name , "Jane"); // 문자열 복사 } // change() 구조체의 주소를 함수호출시 인수로 넘김 인수의 원본 주소를 참조하고 있음 원본 구조체의 멤버 id 값을 변경 strcpy()는 문자열을 복사하는 라이브러리 함수 ex) strcpy(a, b) => b문자열을 a로 복사

49 예제 10-6 구조체 주소를 함수의 인수로 넘겨주는 프로그램 변경 전의 s1 구조체의 멤버 변경 후의 s1 구조체의 멤버

50 함수의 구조체 반환

51 예제 10-7 행렬의 덧셈을 구하는 프로그램 구조체 변수 2개를 선언하여 각각의 멤버를 초기화 한 후에 x1은 x1끼리, y1은 y1끼리 각각 덧셈을 수행하여 새로운 구조체를 만드는 프로그램을 작성한다.

52 예제 10-7 행렬의 덧셈을 구하는 프로그램 // C_EXAMPLE\ch10\ch10_project7\structmatrix.c #include <stdio.h> // Matrix 구조체 선언 struct Matrix { int x1; int x2; int y1; int y2; }; // 함수원형선언 struct Matrix sumMatrix(struct Matrix, struct Matrix); void main(void) // 구조체 변수 선언 struct Matrix M1 = {1, 2, 3, 4}; struct Matrix M2 = {11, 12, 13, 14}; struct Matrix Sum; Matrix 구조체 선언 함수원형선언 구조체 변수 선언 및 초기화 행렬을 더한 값을 저장할 구조체

53 예제 10-7 행렬의 덧셈을 구하는 프로그램 // sumMatrix() 함수호출, 반환된 값을 Sum 구조체 변수에 저장
Sum = sumMatrix(M1, M2); // 덧셈 후의 구조체 값 printf("x1=%d x2=%d \ny1=%d y2=%d \n", Sum.x1, Sum.x2, Sum.y1, Sum.y2); } // main() // sumMatrix() 함수정의 struct Matrix sumMatrix(struct Matrix a1, struct Matrix a2) { struct Matrix ret; // 임시 구조체 변수 선언 ret.x1 = a1.x1 + a2.x1; ret.x2 = a1.x2 + a2.x2; ret.y1 = a1.y1 + a2.y1; ret.y2 = a1.y2 + a2.y2; return ret; // 구조체 반환 } // sumMatrix() 2개의 구조체를 인수로 하여 sumMatrix() 함수를 호출하고, 그 결과를 Sum 구조체에 저장 각 구조체 멤버들간의 연산결과를 ret 구조체 변수에 저장

54 예제 10-7 행렬의 덧셈을 구하는 프로그램 각각의 멤버간 덧셈이 되었다.

55 중첩된 구조체란? 구조체의 멤버가 또 다른 하나의 구조체가 되는 것을 말한다.

56 중첩된 구조체 선언의 예

57 구조체를 초기화 하는 방법

58 중첩된 구조체의 멤버 참조 방법

59 예제 10-8 중첩된 구조체 활용 프로그램 2개의 구조체를 선언하는데, 한 개의 구조체는 다른 하나의 구조체를 멤버로 하도록 프로그램을 작성한다.

60 예제 10-8 중첩된 구조체 활용 프로그램 // C_EXAMPLE\ch10\ch10_project8\nestedstruct.c
#include <stdio.h> // info 구조체 선언 struct info { char name[10]; int number; char gender; }; // student 구조체 선언 struct student struct info in; // 구조체 내부에 또 다른 구조체를 사용 int score; char grade; 1번 구조체 선언 2번 구조체 선언 구조체를 구조체의 멤버로 사용함

61 예제 10-8 중첩된 구조체 활용 프로그램 void main(void) { // 구조체 배열 선언
struct student s[3] = { { {"Joey", 18, 'M'}, 100, 'A'}, { {"Jane", 25, 'F'}, 89, 'B'}, { {"John", 31, 'M'}, 44, 'F'} }; int i; // 루프를 돌면서 구조체의 멤버를 출력 for(i = 0; i < 3; i++) printf("이름 : %s, 번호 : %d, 성별 : %c, 점수 : %d, 등급 : %c \n", s[i].in.name, s[i].in.number, s[i].in.gender, s[i].score, s[i].grade); } // for } // main() s[0].in의 멤버 초기화 s[0]의 멤버 초기화 s[1]의 멤버 초기화 s[2]의 멤버 초기화 구조체 내의 구조체 멤버를 참조하기 위해서는 . 연산자를 2번 사용함

62 예제 10-8 중첩된 구조체 활용 프로그램 각각의 멤버간 덧셈이 되었다.

63 비트 필드 구조체란? 비트 필드(bit field) 구조체는 0 또는 1의 비트단위로 구조체의 멤버를 선언하여 메모리를 효율적으로 관리할 때 사용하는 기법이다. 비트 필트 구조체는 각 멤버들이 0 또는 1의 비트단위로 이루어져 있으므로 값을 할당할 때 불필요한 메모리의 사용을 방지할 수 있음 비트단위의 연산 및 비트단위로 처리된 각종 연산을 보다 손쉽게 처리할 수 있는 장점이 있다.

64 비트 필드 구조체의 선언 방법

65 비트 필드 구조체의 멤버 참조 방법 비트 필드의 구조체 멤버를 참조할 때는 일반 구조체와 동일하다.
구조체 멤버 연산자(.)를 사용한다.

66 비트 필드 구조체의 크기 비트 필드 구조체는 하나의 구조체의 크기가 32비트(int형)를 초과할 수 없으며, 각 비트 필드도 그 크기가 32비트를 초과할 수 없다.

67 예제 10-9 비트 필드 구조체를 활용하는 프로그램 1 비트 필드 구조체를 선언하고, 이를 구성하는 멤버 4개를 선언하는데 2번째 멤버는 2개의 비트를 할당하도록 한다. 각 멤버에 값을 할당하여 최종적으로 비트 필드 구조체가 어떠한 값을 갖는지를 확인하는 프로그램을 작성한다.

68 예제 10-9 비트 필드 구조체를 활용하는 프로그램 1 // C_EXAMPLE\ch10\ch10_project9\bitfieldstruct1.c #include <stdio.h> // 비트 필드 구조체 선언 struct bitField { unsigned a : 1; unsigned b : 2; // 2개의 비트 공간을 할당 unsigned c : 1; unsigned d : 1; }bit; void main(void) bit.a = 1; bit.b = 3; // 3은 2진수로 11 bit.c = 1; bit.d = 0; printf("%d \n", bit); // 2진수로 01111, 10진수로 15 } // main() 총 5개의 비트가 할당되었음 01111로 할당된다.

69 예제 10-9 비트 필드 구조체를 활용하는 프로그램 1 01111

70 예제 10-10 비트 필드 구조체를 활용하는 프로그램 2 비트 필드 구조체를 선언하고, 이를 구성하는 멤버 4개를 선언하는데 2번째 멤버는 비트 필드명을 생략하고 2개의 비트를 할당한다. 각 멤버에 값을 할당하여 최종적으로 비트 필드 구조체가 어떠한 값을 갖는지를 확인하는 프로그램을 작성한다.

71 예제 10-10 비트 필드 구조체를 활용하는 프로그램 2 // C_EXAMPLE\ch10\ch10_project10\bitfieldstruct2.c #include <stdio.h> // 비트 필드 구조체 선언 struct bitField { unsigned a : 1; unsigned : 2; // 비트 필드명을 생략하고 2개의 비트 공간을 할당 unsigned c : 1; unsigned d : 1; }bit; void main(void) bit.a = 1; bit.c = 1; bit.d = 0; printf("%d \n", bit); // 2진수로 01001, 10진수로 9 } // main() 총 5개의 비트가 할당되었음 01001로 할당된다.

72 예제 10-10 비트 필드 구조체를 활용하는 프로그램 2 01001

73 예제 10-11 비트 필드 구조체를 활용하는 프로그램 3 비트 필드 구조체의 일부 필드명을 생략하고 그 공간을 0으로 할당하는 경우 그 이후의 필드들은 현비트 필드 구조체에 할당되지 않는다. 각 멤버에 값을 할당하여 최종적으로 비트 필드 구조체가 어떠한 값을 갖는지를 확인하는 프로그램을 작성한다.

74 예제 10-11 비트 필드 구조체를 활용하는 프로그램 3 // C_EXAMPLE\ch10\ch10_project11\bitfieldstruct3.c #include <stdio.h> // 비트 필드 구조체 선언 struct bitField { unsigned a : 1; unsigned b : 2; // 2개의 비트 공간을 할당 unsigned : 0; // 이후의 필드들은 현 비트 필드 구조체에 할당되지 않음 unsigned d : 4; // 현 비트 필드 구조체에 필드가 할당되지 않음 }bit; void main(void) bit.a = 1; bit.b = 3; bit.d = 1; printf("%d \n", bit); // 2진수로 111, 10진수로 7 } // main() 총 3개의 비트가 할당되었음 111로 할당된다. 할당되지 않는다.

75 예제 10-11 비트 필드 구조체를 활용하는 프로그램 3 111

76 예제 10-12 비트 필드 구조체를 활용하는 프로그램 4 비트 필드 구조체는 하나의 구조체의 크기가 32비트(int형)를 초과할 수 없으며, 각 비트 필드도 그 크기가 32비트를 초과할 수 없다. 각 멤버에 값을 할당하여 최종적으로 비트 필드 구조체가 어떠한 값을 갖는지를 확인하는 프로그램을 작성한다.

77 예제 10-12 비트 필드 구조체를 활용하는 프로그램 4 // C_EXAMPLE\ch10\ch10_project12\bitfieldstruct4.c #include <stdio.h> // 비트 필드 구조체 선언 struct bitField { unsigned a : 31; // 31개의 비트 공간을 할당 unsigned b : 1; // 1개의 비트 공간을 할당 unsigned c : 1; // 32비트를 초과한 필드들은 현 비트 필드 구조체에 unsigned d : 1; // 할당되지 않음 }bit; void main(void) bit.a = 1; bit.b = 1; bit.c = 1; bit.d = 1; printf("%d \n", bit); // 2진수로 // 10진수로 는 가 됨 } // main() 할당되지 않는다.

78 예제 10-12 비트 필드 구조체를 활용하는 프로그램 4 는 int형의 오버플로우가 됨

79 공용체란? 공용체(union)는 하나의 메모리 공간에 서로 다른 자료형을 공유할 수 있어 메모리를 절약할 수 있다.
공용체는 공용체 내부에 선언된 멤버들이 메모리를 하나로 공유한다는 차원에서 공용이란 말을 사용하였으며, 메모리에 할당될 때 멤버 중 가장 큰 변수의 크기 하나만 가지고 있다.

80 공용체의 선언 방법 공용체를 선언하는 방법은 union이라는 키워드를 사용하며, 구조체를 선언하는 방법과 동일하다.

81 공용체의 초기화 방법 공용체를 초기화하는 방법은 구조체를 초기화하는 방법과 동일하며, 멤버에 참조하는 방법도 구조체와 동일하다. 공용체의 멤버에 값을 쓸 때에는 메모리를 서로 공용하기 때문에 값을 덮어 씌우면, 이전에 할당된 변수의 내용을 참조할 수 없다.

82 공용체의 멤버 참조 방법

83 구조체의 메모리 할당 방식1

84 구조체의 메모리 할당 방식2

85 공용체의 메모리 할당 방식

86 공용체의 멤버에 값을 대입하고 출력하는 프로그램
예제 10-13 공용체의 멤버에 값을 대입하고 출력하는 프로그램 student 공용체를 선언하는데 멤버는 3개로 하고, 각 공용체의 멤버에 차례대로 값을 대입한 뒤에 바로 값을 출력하고 처음에 선언한 name의 멤버값을 다시 출력하는 프로그램을 작성한다.

87 공용체의 멤버에 값을 대입하고 출력하는 프로그램
예제 10-13 공용체의 멤버에 값을 대입하고 출력하는 프로그램 // C_EXAMPLE\ch10\ch10_project13\simpleunion.c #include <stdio.h> #include <string.h> // student 공용체 선언 union student { char name[10]; char id; char bloodType[2]; }st; 가장 큰 변수 name의 크기로 공용함(10바이트)

88 공용체의 멤버에 값을 대입하고 출력하는 프로그램
예제 10-13 공용체의 멤버에 값을 대입하고 출력하는 프로그램 void main(void) { strcpy(st.name, "Joey"); // name 멤버에 "Joey" 문자열 복사 printf("name = %s\n", st.name); st.id = 1; // id 멤버에 1대입 printf("id = %d\n", st.id); strcpy(st.bloodType, "AB"); // bloodType에 "AB" 문자열 복사 printf("blood type = %s\n", st.bloodType); printf("name = %s\n", st.name); // name 값 출력 } // main() strcpy() 라이브러리 함수를 이용하여 문자열 복사 구조체와 같은 방법으로 공용체 멤버에 값 대입 이 위치의 메모리에 값이 이미 다른 값이 저장되었음

89 공용체의 멤버에 값을 대입하고 출력하는 프로그램
예제 10-13 공용체의 멤버에 값을 대입하고 출력하는 프로그램 st.name st.id st.bloodType st.name 이나 이미 메모리에 다른 변수가 차지하고 있으므로, 최종 할당된 값 “AB”로 출력됨

90 예제 10-14 구조체 및 공용체의 크기를 확인하는 프로그램
char형 배열 6개와 int형, double형을 멤버로 갖는 공용체와 구조체를 각각 선언하고, 변수를 선언한 뒤에 이들의 크기를 각각 출력하는 프로그램을 작성한다.

91 예제 10-14 구조체 및 공용체의 크기를 확인하는 프로그램
// C_EXAMPLE\ch10\ch10_project14\unionsize.c #include <stdio.h> // 공용체 선언 union U{ char a[10]; int b; double c; }u; // 구조체 선언 struct S { }s; void main(void) printf("sizeof(u) = %d \n", sizeof(u)); // 공용체의 크기 printf("sizeof(s) = %d \n", sizeof(s)); // 구조체의 크기 } // main() 공용체 변수 u의 크기를 출력 구조체 변수 s의 크기를 출력

92 예제 10-14 구조체 및 공용체의 크기를 확인하는 프로그램 공용체 변수 u가 메모리에 할당되는 크기
구조체 변수 s가 메모리에 할당되는 크기

93 형정의란? 형정의(typedef)는 프로그램을 작성하는 사람이 임의로 자료형을 생성하는 것을 말한다.
기존에 사용하고 있는 자료형을 프로그래머가 쉽게 이해할 수 있도록 자신의 취향에 맞게 바꾸는 경우와 복잡한 함수 혹은 구조체를 형정의하므로써 쉽게 사용할 수 있다.

94 형정의 방법 형정의를 하는 방법은 typedef 키워드를 활용한다.

95 형정의 사용 예 unsigned int를 UI로 형정의하면, 2개의 문장은 같은 문장이 되는 것이다.

96 형정의 예 - 1

97 형정의 예 - 2

98 형정의 예 - 3

99 예제 10-15 일반 변수 및 구조체를 형정의하는 프로그램
unsigned int 자료형을 UI로 형정의하고, 간단한 구조체 DATA를 형정의하여 값을 대입하고 출력해 보는 프로그램을 작성한다.

100 예제 10-15 일반 변수 및 구조체를 형정의하는 프로그램
// C_EXAMPLE\ch10\ch10_project15\simpletypedef.c #include <stdio.h> // 각각의 자료형 형정의 typedef unsigned int UI; typedef unsigned char UC; typedef unsigned char STR[10]; // data 구조체를 DATA로 형정의 typedef struct data { UC id; // unsigned char id UI number; // unsigned int number STR name; // unsigned char name[10] }DATA; 3가지 자료형에 대한 형정의 구조체를 형정의

101 예제 10-15 일반 변수 및 구조체를 형정의하는 프로그램 void main(void) {
DATA record[3] = { // struct data record[3] {1, 18, "Joey"}, {2, 30, "Jane"}, {3, 40, "John"} }; UC i; // unsigned char I for(i = 0; i < 3; i++) printf("%3d %3d %s \n", record[i].id, record[i].number, record[i].name); } // for } // main() data 구조체 배열 for 문에 사용할 변수

102 예제 10-15 일반 변수 및 구조체를 형정의하는 프로그램 record[0]의 멤버 record[1]의 멤버


Download ppt "C언어: 구조체 (Structures)."

Similar presentations


Ads by Google