C 프로그래밍프로젝트 Chap 22. 구조체와사용자정의자료형 1 2013.10.10. 오병우 컴퓨터공학과
구조체의정의 (Structure) 구조체 하나이상의기본자료형을기반으로사용자정의자료형 (User Defined Data Type) 을만들수있는문법요소 배열 vs. 구조체 배열 : 한가지자료형의집합 구조체 : 여러가지자료형의집합 사용자정의자료형 struct point { int x; int y; }; // point 라는이름의구조체선언 // 구조체멤버 int x // 구조체멤버 int y Department of Computer Engineering 2
구조체의정의 int int xpos; xpos; int int ypos; // // 마우스의마우스의 x 좌표 x 좌표 // // 마우스의 y 좌표 y 좌표 마우스의좌표정보를저장하고관리하기위해서는 x 좌표와 y 좌표를저장할수있는두개의변수가필요하다. xpos 와 ypos 는서로독립된정보를표현하지않고하나의정보를표현한다. 따라서이둘은늘함께한다. struct point // point라는이름의구조체정의 { int xpos; // point 구조체를구성하는멤버 xpos int ypos; // point 구조체를구성하는멤버 ypos }; 구조체를이용해서 xpos 와 ypos 를하나로묶었다. 이둘을묶어서 point 라는이름의새로운자료형을정의! int 가자료형의이름인것처럼 point 도자료형의이름이다. 단, 프로그래머가정의한자료형이기에 사용자정의자료형 (user defined data type) 이라한다. struct person { char name[20]; // 이름저장 char phonenum[20]; // 전화번호저장 int age; // 나이저장 }; 개인의이름과전화번호나이정보를 person 이라는구조체정의를통해서묶고있다. 배열도구조체의멤버로선언이가능! Department of Computer Engineering 3
구조체변수의선언과접근 포인터는 -> 사용 구조체변수선언의기본형태 struct type_name val_name ; 멤버의접근방식 마침표 (.) 사용 구조체변수의이름. 구조체멤버의이름 struct point pos; struct person man; 구조체변수선언의예 pos.xpos=20; 구조체변수 pos의멤버 xpos에 20을저장 printf("%s \n", man.name); man의멤버 name에저장된문자열출력 구조체변수선언의결과 Department of Computer Engineering 4
구조체변수의선언과접근관련예제 1 #include <stdio.h> #include <math.h> struct point { int x; int y; }; Main.c int main (void) { struct point p1, p2; double distance; printf(" 첫번째점의 x, y 좌표입력 : "); scanf("%d %d", &p1.x, &p1.y); } printf(" 두번째점의 x, y 좌표입력 : "); scanf("%d %d", &p2.x, &p2.y); distance = sqrt ((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y)); printf(" 두점의거리는 %5.1lf 입니다.\n", distance); return 0; 이예제에서호출하는함수 sqrt 는제곱근을반환하는함수로서헤더파일 math.h 에선언된수학관련함수이다. Department of Computer Engineering 5
Point 예제의모듈화 // Point.h : Header File of the Point Module /////////////////////////////////////////// #ifndef _POINT_H_ #define _POINT_H_ Point.h // Main.c : Main Implementation File /////////////////////////////////////////// //#include "stdafx.h // Precompiled Header 사용시 struct point { int x; int y; }; extern double pointgetdistance( struct point p1, struct point p2); #endif// _POINT_H_ #include <stdio.h> #include Point.h int main (void) { struct point p1, p2; double distance; Main.c // Point.c : Implementatin of the Point Module /////////////////////////////////////////// //#include "stdafx.h // Precompiled Header 사용시 #include <math.h> Point.c #include Point.h double pointgetdistance(struct point p1, struct point p2) { return sqrt ((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y)); } } printf(" 첫번째점의 x, y 좌표입력 : ); scanf("%d %d", &p1.x, &p1.y); printf(" 두번째점의 x, y 좌표입력 : ); scanf("%d %d", &p2.x, &p2.y); printf(" 두점의거리는 %5.1lf 입니다.\n", pointgetdistance(p1, p2)); return 0; Department of Computer Engineering 6
구조체변수의선언과접근관련예제 2 구조체의멤버라하더라도일반적인접근의방식을그대로따른다. 구조체의멤버로배열이선언되면배열의접근방식을취하면되고, 구조체의멤버로포인터변수가선언되면포인터변수의접근방식을취하면된다. 실행결과 Department of Computer Engineering 7
구조체정의와동시에변수선언하기 point 라는이름의구조체를정의함과동시에 point 구조체의변수 pos1, pos2, pos3 를선언하는문장이다. 위와동일한결과를보이는구조체의정의와변수의선언이다. 구조체를정의함과동시에변수를선언하는문장은잘사용되지않는다. 그러나문법적으로지원이되고또간혹사용하는경우도있다. Department of Computer Engineering 8
구조체변수의초기화 초기화방식이배열과유사하다. 초기화할데이터들을중괄호안에순서대로나열하면된다.. 실행결과 Department of Computer Engineering 9
구조체배열의선언과접근 struct point arr[4]; 길이가 4 인구조체배열의선언방법 선언된배열의형태 실행결과 Department of Computer Engineering 10
구조체배열의초기화 struct person man={" 이승기 ", "010-1212-0001", 21}; 구조체변수의초기화 구조체변수하나를초기화하기위해서하나의중괄호를사용하듯이... struct person arr[3]={ {" 이승기 ", "010-1212-0001", 21}, // 첫번째요소의초기화 {" 정지영 ", "010-1313-0002", 22}, // 두번째요소의초기화 {" 한지수 ", "010-1717-0003", 19} // 세번째요소의초기화 }; 구조체배열의초기화 구조체배열을초기화하기위해서배열요소각각의초기화값을중괄호로 묶어서표현한다. Department of Computer Engineering 11
구조체배열의초기화예제 실행결과 Department of Computer Engineering 12
구조체변수와포인터 구조체 point 의포인터변수선언 pptr 이가리키는구조체변수의멤버 xpos 에접근 pptr 이가리키는구조체변수의멤버 ypos 에접근 구조체포인터변수를대상으로하는 포인터연산및멤버의접근방법 포인터는 -> 사용 -> 연산자를기반으로하는구조체변수 의멤버접근방법 Department of Computer Engineering 13
구조체변수와포인터관련예제 프로그래머들이주로사용하는연산자이니 -> 연산자의사용에익숙해지자. 실행결과 Department of Computer Engineering 14
포인터변수를구조체의멤버로선언하기 1 구조체변수의멤버로구조체포인터변수가선언될수있다! 실행결과 Department of Computer Engineering 15
포인터변수를구조체의멤버로선언하기 2 type 형구조체변수의멤버로 type 형포인터변수를둘수있다. 실행결과 Department of Computer Engineering 16
자기참조형구조체 Linked List struct person { char name[20]; char pid[20]; struct person* frnd; }; 자기참조형구조체 메모리동적할당 int main() { struct person man1={"mr. Lee", "820204-0000512"}; struct person man2={"mr. Lee's Friend", "820000-0000101"}; } man2.frnd = NULL; man1.frnd=&man2; printf("[mr. Lee]\n"); printf("name : %s\n", man1.name); printf("pid : %s\n", man1.pid); printf("[his Friend]\n"); printf("name : %s\n", man1.frnd->name); printf("pid : %s\n", man1.frnd->pid); return 0; man1 man2 name: Mr. Lee name: Friend pid: 820204- pid: 820000- frnd: frnd: NULL Department of Computer Engineering 17
구조체변수와첫번째멤버의주소값 구조체변수의주소값과구조체변수의첫번째멤버의주소값은일치한다. 응용프로그램분야에서는이사실을이용해서프로그램을작성하기도한다. 실행결과 Department of Computer Engineering 18