(structures) 구조체정의 구조체선언및초기화 구조체배열 구조체포인터 구조체배열과포인터 구조체와함수 중첩된구조체 구조체동적할당 공용체 (union) 1
구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을만들어사용할수있다. 예 1) 좌표평면상의좌표를프로그램에서다루고자한다. 좌표는 (x,y) 와같이두개의숫자를묶어서하나의데이터로처리해야한다. x y 예 2) 학생성적처리를위해서 학번, 이름, 성적 을묶어서하나의데이터로처리하고자한다. no name score 2
구조체정의 사용자정의자료형 (user-defined data types) 구조체 (structure) 공용체 (union) 구조체 Structure provides a means to aggregate variables of different types. point 는구조체명 ( 태그 ) struct point { int xcoord; // 멤버변수또는필드 int ycoord; } ; struct point a ; // a 는구조체변수명 int x ; // x 는정수형변수명 float y ; // y 는실수형변수명 char z ; // z 는문자형변수명 data type 3
구조체정의 구조체선언의다양한형태 Declaration of struct 1 struct point { int xcoord; int ycoord; struct point a, b; struct point c[100]; Declaration of struct 3 struct point { int xcoord; int ycoord; typedef struct point POINT; POINT a, b, c[100]; Declaration of struct 2 struct point { int xcoord; int ycoord; } a, b, c[100]; Declaration of struct 4 typedef struct { int xcoord; int ycoord; } POINT; POINT a, b, c[100]; 이경우에는 POINT 로만변수선언이가능하다. 4
구조체정의 구조체선언의다양한형태 typedef struct point { int xcoord; int ycoord; } POINT; POINT a, b, c[100]; 이경우에는 struct point 로도변수선언이가능하고 POINT 로도변수선언이가능하다. struct { int xcoord; int ycoord; } a, b, c[100]; 이경우에는 xcoord 와 ycoord 두개의멤버변수를갖는구조체변수 a, b 와구조체배열 c 를선언한다. 하지만구조체이름 ( 태그 ) 가없기때문에이후로는이구조체변수는선언할수없다. 5
구조체정의 #include <stdio.h> struct point { int xcoord; int ycoord; int main() { struct point a, b; struct point c[100]; 구조체선언을 main 위에하면프로그램전체에서 struct point 자료형을사용할수있다. main 함수안에서선언하면 main 함수에서만사용할수있다.... } 6
구조체선언및초기화 구조체멤버접근기호 :., -> typedef struct { int xcoord; int ycoord; } POINT; int main() { POINT a, b, c; a.xcoord = 10; a.ycoord = 20; b.xcoord = 4; b.ycoord = 5; POINT a={10,20 POINT b={4,5 POINT c; POINT a={10,20}, b={4,5}, c; c.xcoord = a.xcoord + b.xcoord; c.ycoord = a.ycoord + b.ycoord; printf("%d %d \n", c.xcoord, c.ycoord); } return 0; 7
구조체선언및초기화 struct point { int x; int y; typedef struct point POINT ; POINT a = {2,3}, b={1,5}, c; // 구조체초기화 c = a + b; 불가능 (why?) printf( c : %d \n,. ) 구조체를통째로출력불가능 c = a; 구조체를대입하는것은가능 8
구조체선언및초기화 typedef struct { int no; char name[20]; int score; } student ; student s1 = { 20141234, Lee, 90 student s2; s2.no = 20140001; s2.name = Kim ; // error!! name 은배열임. strcpy(s2.name, Kim ); s2.score = 80; 9
구조체배열 struct point { int x; int y; typedef struct point POINT ; POINT pt[5] = {{1,2}, {3,5}, {7,8}, {10, 11}, {6,9} 정수배열 int A[5] = { 1,3,5,7,9 0 1 2 3 4 1 2 3 5 7 8 10 11 6 9 pt[0] pt[1] pt[2] pt[3] pt[4] pt[0].x pt[0].y pt[1].x pt[1].y pt[2].x pt[2].y pt[3].x pt[3].y pt[4].x pt[4].y 10
구조체포인터 struct point { int x; int y; typedef struct point POINT ; POINT p1={1,2}, p2={5,6 POINT* pt; p1 1 2 p2 5 6 pt = &p1; pt *pt.x 로하면안되는지? p1.x = 7; p1.y = 9; pt -> x = 7; pt -> y = 9; (*pt).x = 7; (*pt).y = 9; 모두같은표현. ( 구조체 p1 의값을 7,9 로바꾸고자함 ) 포인터로구조체의필드에접근할때는 -> 이용함. 11
operators associativity ( ) [ ] ->. ++(postfix) -- (postfix) ++ (prefix) -- (prefix)! ~ sizeof(type) + (unary) - (unary) & (address) * (indirection) * / % + - << >> < <= > >= ==!= & ^ &&?: = += -= *= /= %= >>= <<= &= ^= =, (comma operator) 12
구조체배열과포인터 struct point { int x; int y; typedef struct point POINT ; POINT pa[3] = {{3,5}, {7,8}, {2,9} POINT* pt; pt = pa; pa 0 1 2 3 5 7 8 2 9 pt->x (*pt).x pt[0].x pa[0].x (*pa).x pt (*(pt+1)).x (pt+1)->x pa[1].x pt[1].x 13
구조체와함수 구조체변수는함수의인자가될수있다. (call-by-value) typedef struct { int stuid; char name[10]; int score; } student; void changescore( student ); int main() { student st; st.stuid = 20141234; strcpy(st.name, "Lee"); st.score = 90; changescore( st ); printf("%d %s %d \n", st.stuid, st.name, st.score); } return 0; void changescore( student s ) { s.score += 5; } 14
구조체와함수 구조체변수는함수의인자가될수있다. (call-by-reference) typedef struct { int stuid; char name[10]; int score; } student; void changescore2( student * p ); int main() { student st; st.stuid = 20121234; strcpy(st.name, "Lee"); st.score = 90; changescore2 ( &st ); printf("%d %s %d \n", st.stuid, st.name, st.score); return 0; } void changescore2( student * p ) { p->score += 5; } 15
구조체와함수 구조체는함수의반환값이될수있다. typedef struct { int stuid; char name[10]; int score; } student; student changescore3( ); int main() { student s1, s2, s3; s1.stuid = 20141234; strcpy(s1.name, "Lee"); s1.score = 90; s2 = s1; s3 = changescore3( ); return 0; } student changescore3( ) { student stu; stu.stuid = 20143333; strcpy(stu.name, Kim ); stu.score = 93; return stu; } 16
중첩된구조체 (nested structure) typedef struct { int korean; int math; int eng; } SCORE; typedef struct { int no; char name[20]; SCORE score; char phone[15]; } STUDENT; int main() { STUDENT s1 = {20141111, "Kim", {90, 80, 70}, "010-111-1111" STUDENT s2; SCORE s = {85, 90, 95 s2.no = 20142222; strcpy(s2.name, "Lee"); s2.score = {85,90, 95 // error!! s2.score = s; ok!! s2.score.korean = 85; s2.score.math = 90; s2.score.eng = 95; ok!! } strcpy(s2.phone, "010-222-2222"); 17
구조체동적할당 struct point { int x; int y; typedef struct point POINT ; POINT *s, *t; s = (POINT*) malloc(sizeof(point)); s->x = 10; s->y = 20; s 10 20 t t = (POINT*) malloc(sizeof(point) * 5); t[3].x = 5; t[3].y = 6; 5 6 heap 18
공용체 (union) 공용체는구조체와같은구문형식을갖지만각멤버들은같은기억 장소를공유한다. mydata 는공용체명 ( 태그 ) data type union mydata { int float f; char c; i; // 공용체멤버변수또는필드 union mydata m; m.i = 100; m.f = 55.7f; m.c = A ; m 은멤버변수중에서가장큰공간을요구하는변수의공간만큼할당된다. m m 100 55.7f 100 위에덮어쓴다. m A 55.7f 위에덮어쓴다. 19
공용체 (union) union mydata { int i; float f; char c; typedef union mydata data; typedef union mydata { int i; float f; char c; } data; data dt; dt.i = 100; dt.f = 55.7f; dt.c = A ; 20
공용체 (union) union info { int career; // 직원의경우근속연수를저장한다. float score; // 학생이면성적을저장한다. struct person { int id ; // 고유아이디 char name[20]; // 이름 union info Info; // 학생이면성적, 직원이면근속연수 char phone[20]; // 전화번호 struct person student, officer; student.id = 20141111; strcpy(student.name, Hong Gil Dong ); student.info.score = 92.5f; strcpy(student.phone, 010-111-1111 ); officer.id = 10020; strcpy(officer.name, Lee Chul Soo ); officer.info.career = 5; strcpy(officer.phone, 010-222-2222 ); 21