Download presentation
Presentation is loading. Please wait.
1
2007 1학기 16 구조체
2
구조체 Perfect C 구조체의 필요성 struct 구조체 정의 책에 대한 정보를 살펴보면 매우 다양
구조체는 연관된 멤버로 구성되는 통합 자료형으로 대표적인 유도자료형 구조체 정의 중괄호 사이에 원하는 여러 개의 변수를 선언 중괄호 다음 마지막에 세미콜론(;)을 반드시 기술 책 정보 제목, 저자, 출판사, 페이지수, 가격, ISBN 등 Perfect C
3
구조체 정의와 변수 선언 Perfect C 구조체 정의 변수 선언 구조체 멤버(구성요소, member)
구조체 정의 구문에서는 각 구성요소의 초기값을 대입할 수 없음 한 구조체 내부에서 선언되는 구조체 멤버의 이름은 모두 유일 구조체의 정의는 구조체 struct book을 새로운 자료형으로 정의하는 구문 구조체 정의는 구조체 변수를 선언하는 구문이 아님 변수 선언 구조체 정의 구문은 변수의 범위와 비슷 구조체 정의 구문의 위치에 따라 구조체 선언 시 자료형 이용의 범위가 정해짐 Perfect C
4
구조체 정의와 변수 선언 구조체 변수를 선언하는 다른 방법은 다음과 같이 구조체 정의와 변수 선언을 함께하는 방법 위 구문에서 변수 yourbook과 mybook은 모두 같은 구조체 struct book 자료형 위 구조체 정의 구문에서 구조체 태그 이름 book을 생략해도 구조체 변수 선언이 가능 Perfect C
5
자료형이 다른 구조체 Perfect C 다음 구문에서 구조체 변수 mybook과 yourbook은 자료형이 다른 변수
즉 동일한 구조체 태그 이름으로 선언된 변수만이 동일한 자료형의 구조체가 됨 자료형이 다르면 대입연산자를 사용 불가능 Perfect C
6
typedef를 이용한 형 선언 typedef를 이용한 형 선언 typedef로 구조체 정의 Perfect C
struct book { char title[50]; //제목 char author[50]; //저자 char publish[50]; //출판사 int pages; //페이지수 int price; //가격 }; typedef struct book book ; … book yourbook; book mybook; typedef를 이용한 형 선언 구조체 struct book이 정의된 상태에서 구조체 struct book 좀 더 간단하게 선언 typedef로 구조체 정의 구조체 정의 자체를 typedef와 함께하는 방법 아래 typedef 구문에서 새로운 자료형으로 정의되는 키워드는 software로서, 이 구문 이후에는 구조체를 선언할 때 software를 이용하여 형의 선언이 가능 Perfect C
7
초기 값 지정 구조체 struct book 정의 구조체 변수 mybook에 초기 값을 대입 멤버 참조 Perfect C
구조체 정의에서는 구조체 멤버에 초기 값을 지정 불가능 구조체 변수 mybook에 초기 값을 대입 구조체 변수도 배열과 같이 중괄호를 이용하여 초기 값을 대입 가능 멤버 참조 구조체 멤버를 접근하기 위해서는 멤버 접근 연산자인 마침표(.)를 이용 struct book { … int pages = 200; int price = 30000; }; typedef struct book book; 구조체 정의에서 멤버의 초기 값을 저장하는 것은 허용되지 않는다. book mybook = "강 환수", "학술정보", 530, 20000}; 구조체변수.구조체멤버 mybook.author Perfect C
8
예제 소스 structbook.c 구조체 정의, 변수 선언, 구조체 이용 프로그램 Perfect C
9
복소수 구조체 복소수를 표현하는 구조체 complex를 정의 Perfect C
복소수는 a+bi로 표현되며, 실수부 a와 허수부 b는 실수 값 구조체 struct complex는 다음과 같이 정의 struct complex { double real; //실수 double img; //허수 }; typedef struct complex complex; Perfect C
10
구조체 주의 Perfect C 메인 함수 상단 전역 부분에서 struct complex를 정의
메인 함수 내부에서 다시 같은 이름으로 struct complex를 정의하면서 변수 comp를 하나 선언 comp = comp3;와 같은 대입문은 에러 두 변수 comp1과 comp2는 다시 complex 유형으로 선언 Perfect C
11
구조체 포인터 Perfect C 구조체 변수를 가리키는 주소 값을 저장하려면 구조체 포인터 변수를 이용
변수 ku는 구조체 변수이고, 변수 ptr은 구조체를 가리키는 포인터 struct univ { char title[50]; //이름 char address[50]; //주소 int students; //학생수 }; struct univ ku = {"한국대학교", "서울시 서초구", 5000}; struct univ *ptr = &ku; Perfect C
12
구조체 포인터 이용 연산자 -> 간접 연산자 * Perfect C
구조체 포인터 변수 ptr을 이용하여 구조체의 멤버를 참조하려면 연산자 ->를 이용 연산자 ->는 구조체 멤버 참조 연산자로서 연산자 우선순위가 가장 높음 간접 연산자 * 변수 ptr을 이용하여 구조체의 멤버 member를 참조하는 다른 방법은 (*ptr).member를 이용하는 방법 위 구문에서 (*ptr).title은 *ptr.title과는 다른 의미이므로 반드시 괄호를 사용 *ptr.title은 *(ptr.title)을 의미하므로 ptr이 포인터 변수이면 에러가 발생 구조체의 멤버를 참조하는 연산자 ->와 .의 연산자 우선순위가 가장 높기 때문 printf("학교 : %s, 주소 : %s, 학생수 : %d\n", ptr->title, ptr->address, ptr->students); printf("학교 : %s, 주소 : %s, 학생수 : %d\n", (*ptr).title, (*ptr).address, (*ptr).students); Perfect C
13
포인터 변수 구조체 변수 및 포인터 변수를 이용하는 다음 4가지 구문을 잘 구별하도록 Perfect C
14
구조체 배열 Perfect C 구조체 변수를 여러 개 선언하기 위해서 구조체 배열을 이용
구조체 book으로 배열 clang[3]을 선언하여 구조체 원소 3개를 선언하는 구문 다른 배열과 같이 구조체 배열도 첨자를 이용하여 각 원소를 참조하며, 첨자는 0부터 (배열크기-1)까지 가능 첫 구조체 원소의 멤버를 출력하는 구문 struct book { char author[50]; char title[50]; int pages; }; struct book clang[3] = { {"Deitel", "C How To Program", 600}, {"Al Kelly", "A Book On C", 700}, {"Stephen Prata", "C Primer Plus", 800} }; printf("저자 : %s, 제목 : %s, 페이지수 : %d\n", clang[0].author, clang[0].title, clang[0].pages); Perfect C
15
구조체 인자, 값 전달 Perfect C 복소수 연산에 이용되는 함수를 구현 구현
함수 paircomplex1()는 전달 인자 복소수의 켤레 복소수를 구하여 반환하는 함수 그러므로 변수 pcomp에는 {3.4, -4.8}이 저장 구현 위와 같이 구조체는 함수의 전달 인자와 반환 값으로 이용이 가능 위 함수는 구조체 인자를 값에 의한 호출(call by value) 방식으로 이용 즉 함수 paircomplex1() 내부에서 지역 구조체 변수 com을 하나 만들어 실인자의 구조체 값을 모두 복사하는 방식으로 구조체 값을 전달 complex comp = {3.4, 4.8}; complex pcomp; pcomp = paircomplex1(comp); complex paircomplex1(complex com) { com.img = -com.img; return com; } Perfect C
16
구조체 인자, 주소 전달 인자를 call by address로 Perfect C
다음 함수 paircomplex2()는 인자를 주소 값으로 저장하여, 실인자의 변수 comp의 값을 직접 수정하는 방식 위 함수를 호출하기 위해서는 comp의 주소 값을 이용해야 하므로 다음과 같이 호출 구조체가 많은 멤버를 가지거나, 큰 배열을 멤버로 가지는 경우, 구조체 자체를 인자로 전달하는 것은 매우 비효율 이러한 경우는 주소 값으로 전달하는 방식인 주소에 의한 호출 방식이 효율적 void paircomplex2(complex *com) { com->img = -com->img; } paircomplex2(&comp) Perfect C
17
Thank You ! 노력 없이 이룰 수 있는 것 아무것도 없다.
Similar presentations