ch08 - 구조체 (structure)...

39
8. 구조체 (Structure) 2015-1 프로그래밍언어 2015년 4월 11일 교수 김 영 탁 영남대학교 공과대학 정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : [email protected])

Upload: others

Post on 16-Mar-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

8. 구조체 (Structure)

2015-1 프로그래밍언어

2015년 4월 11일

교수 김 영 탁

영남대학교 공과대학 정보통신공학과(Tel : +82-53-810-2497; Fax : +82-53-810-4742http://antl.yu.ac.kr/; E-mail : [email protected])

Page 2: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 2

Outline

구조체란 무엇인가 ?구조체의 선언, 초기화, 사용구조체의 활용구조체의 배열구조체와 포인터구조체와 함수공용체열거형 typedef Bit-field 구조체

Page 3: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 3

자료형의 분류

자료형

기본자료형: char, int, float, double 등

파생자료형: 배열 (array), 열거형 (enum), 구조체 (struct), 공용체 (union)

Page 4: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 4

구조체의 필요성학생에 대한 데이터를 하나로 모으려면?

학번: 20100001(정수)이름: “최자영”(문자열)학점: 4.3(실수)…

int number;

char name[10];

double grade;

와 같이 개별 변수로

나타낼 수 있지만

묶을 수가 있나?

Page 5: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 5

구조체의 필요성

구조체를 사용하면 변수들을하나로 묶을 수

있습니다.

int number;

char name[10];

double grade;

Page 6: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 6

구조체와 배열

구조체 vs 배열

같은 자료 유형의 집합 다른 자료 유형의 집합

struct student {

int st_id;char name[50];double avg_score;. . . .

}

int data[50];

Page 7: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 7

구조체 선언

구조체 선언 형식

struct 태그 {자료형 멤버1;자료형 멤버2;...

};

Page 8: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 8

구조체 선언

구조체 선언은 변수 선언은 아님

구조체를 정의하는 것은 와플이나 붕어빵을 만드는 틀을 정의하는 것과 같다.

와플이나 붕어빵을 실제로 만만들릭 위해서는 구조체 변수를 선언하여야 한다.

구조체 구조체변수

Page 9: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 9

구조체 선언의 예

// x값과 y값으로 이루어지는 화면의 좌표struct point {

int x; // x 좌표int y; // y 좌표

};

// 복소수struct complex {

double real; // 실수부double imag; // 허수부

};

// 날짜struct date {

int month;int day;int year;

};

// 사각형struct rect {

int x;int y;int width;int grade;

};

// 직원struct employee {

char name[20]; // 이름int age; // 나이int gender; // 성별int salary; // 월급

};

Page 10: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 10

구조체 변수 선언

구조체 정의와 구조체 변수 선언은 다르다.

Page 11: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 11

구조체의 초기화

중괄호를 이용하여 초기값을 나열한다.

struct student {int number;char name[10];double grade;

};struct student s1 = { 24, "Kim", 4.3 };

Page 12: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 12

구조체 멤버 참조

구조체 멤버를 참조하려면 다음과 같이 ‘.’ 연산자를사용한다.

s1.number = 26; // 정수 멤버

strcpy(s1.name, "Kim"); // 문자열 멤버

s1.grade = 4.3; // 실수 멤버

.기호는구조체에서

멤버를 참조할때 사용하는

연산자입니다. .

Page 13: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 13

예제 #1…struct student {

int number;char name[10];double grade;

};

int main(void){

struct student s;

s.number = 20070001;strcpy(s.name,"홍길동");s.grade = 4.3;

printf("학번: %d\n", s.number);printf("이름: %s\n", s.name);printf(“학점: %f\n", s.grade);return 0;

}학번: 20070001이름: 홍길동학점: 4.300000

구조체 선언

구조체 변수 선언

구조체 멤버 참조

Page 14: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 14

예제 #2struct student {

int number;char name[10];double grade;

};

int main(void){

struct student s;

printf("학번을 입력하시오: ");scanf("%d", &s.number);

printf("이름을 입력하시오: ");scanf("%s", s.name);

printf("학점을 입력하시오(실수): ");scanf("%lf", &s.grade);

printf("학번: %d\n", s.number);printf("이름: %s\n", s.name);printf("학점: %f\n", s.grade);return 0;

}

학번을 입력하시오: 20070001이름을 입력하시오: 홍길동학점을 입력하시오(실수): 4.3학번: 20070001이름: 홍길동학점: 4.300000

구조체 선언

구조체 변수 선언

구조체 멤버의 주소 전달

Page 15: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 15

예제 #3#include <math.h>struct point {

int x;int y;

};

int main(void){

struct point p1, p2;int xdiff, ydiff;double dist;

printf("점의 좌표를 입력하시오(x y): ");scanf("%d %d", &p1.x, &p1.y);

printf("점의 좌표를 입력하시오(x y): ");scanf("%d %d", &p2.x, &p2.y);

xdiff = p1.x - p2.x;ydiff = p1.y - p2.y;

dist = sqrt(xdiff * xdiff + ydiff * ydiff);

printf("두 점사이의 거리는 %f입니다.\n", dist);return 0;

}

점의 좌표를 입력하시오(x y): 10 10점의 좌표를 입력하시오(x y): 20 20두 점사이의 거리는 14.142136입니다.

p1 (x,y)

p2 (x,y)

Page 16: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 16

구조체를 멤버로 가지는 구조체

struct date { // 구조체 선언

int year;int month;int day;

};

struct student { // 구조체 선언

int number;char name[10];struct date dob; // date of birth, 구조체 안에 구조체 포함

double grade;};struct student s1; // 구조체 변수 선언

s1.dob.year = 1983; // 멤버 참조

s1.dob.month = 03;s1.dob.day = 29;

Page 17: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 17

예제

#include <stdio.h>

struct point {int x;int y;

};

struct rect {struct point p1;struct point p2;

};

int main(void){

struct rect r;int w, h, area, peri;

p1(x,y)

p2(x,y)

Page 18: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 18

예제

printf("왼쪽 상단의 좌표를 입력하시오: ");scanf("%d %d", &r.p1.x, &r.p1.y);

printf("오른쪽 상단의 좌표를 입력하시오: ");scanf("%d %d", &r.p2.x, &r.p2.y);

w = r.p2.x - r.p1.x;h = r.p2.x - r.p1.x;

area = w * h;peri = 2 * w + 2 * h;printf("면적은 %d이고 둘레는 %d입니다.\n", area, peri);

return 0;}

p1(x,y)

p2(x,y)

왼쪽 상단의 좌표를 입력하시오: 1 1오른쪽 상단의 좌표를 입력하시오: 6 6면적은 25이고 둘레는 20입니다.

Page 19: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 19

구조체 변수의 대입과 비교

같은 구조체 변수까리 대입은 가능하지만 비교는불가능하다.

struct point {int x;int y;

};

int main(void){

struct point p1 = {10, 20};struct point p2 = {30, 40};

p2 = p1; // 대입 가능

if( p1 == p2 ) // 비교 -> 컴파일 오류!!printf("p1와 p2이같습니다.")

if( (p1.x == p2.x) && (p1.y == p2.y) ) // 올바른 비교printf("p1와 p2이같습니다.")

}

Page 20: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 20

구조체 배열 (Array of Struct)구조체를 여러 개 모은 것

Page 21: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 21

구조체 배열 (Array of Struct)

구조체 배열의 선언

struct student {int number;char name[20];double grade;

};

int main(void){

struct student list[100]; // 구조체의 배열 선언

list[2].number = 27;strcpy(list[2].name, "홍길동");list[2].grade = 178.0;

}

Page 22: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 22

구조체 배열의 초기화

구조체 배열의 초기화

struct student list[3] = {{ 1, "Park", 172.8 },{ 2, "Kim", 179.2 },{ 3, "Lee", 180.3 }

};

Page 23: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 23

구조체 배열 예제

#define SIZE 3

struct student {int number;char name[20];double grade;

}; int main(void){

struct student list[SIZE];int i;

for(i = 0; i < SIZE; i++){

printf("학번을 입력하시오: ");scanf("%d", &list[i].number);printf("이름을 입력하시오: ");scanf("%s", list[i].name);printf("학점을 입력하시오(실수): ");scanf("%lf", &list[i].grade);

}

for(i = 0; i< SIZE; i++)printf("학번: %d, 이름: %s, 학점: %f\n", list[i].number, list[i].name, list[i].grade);

return 0;}

학번을 입력하시오: 20070001이름을 입력하시오: 홍길동학점을 입력하시오(실수): 4.3학번을 입력하시오: 20070002이름을 입력하시오: 김유신학점을 입력하시오(실수): 3.92학번을 입력하시오: 20070003이름을 입력하시오: 이성계학점을 입력하시오(실수): 2.87학번: 20070001, 이름: 홍길동, 학점: 4.300000학번: 20070002, 이름: 김유신, 학점: 3.920000학번: 20070003, 이름: 이성계, 학점: 2.870000

Page 24: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 24

구조체 배열의 응용 예 (1)

Can initialize at declarationExample:

struct Planet {char name[10];double relativeMass;double distance;

};

struct Planet earth = {“Earth”, 1.0, 150};

Declaration provides initial data to all three member variables

Page 25: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 25

Array of Structure

Struct data elements can be organized in array

Example)struct Planet solarSystem[SOLAR_PLANETS] = { {"Mercury", 0.0558, 57.9},

{"Venus", 0.815, 108},{"Earth",1.0, 150},{"Mars", 0.107, 228},{"Jupiter", 318, 778},{"Saturn", 95.1, 1430},{"Uranus", 14.5, 2870},{"Neptune", 17.2, 4500},{"Pluto", 0.11, 5900}

};

Page 26: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 26

Handling attributes of each element of struct arrayvoid printPlanets(struct Planet solarPlanets[], int num_planet)1. {2. for (int i = 0; i<num_planet; i++)3. {4. printf("%2d", i);5. printf(" Name: ");6. printf("%-8s", solarPlanets[i].name);7. printf(" Rel Mass: ");8. printf("%7.3f", solarPlanets[i].relativeMass);9. printf(" Dist from Sun: ");10. printf("%6.1f₩n", solarPlanets[i].distance);11. } // end for12.}

Page 27: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 27

Sorting Array of Structure

Sorting elements in array of structure (1)void sortPlanetsByRelMass(struct Planet solarPlanets[], int num_planet)1. {2. struct Planet temp;3. int i, j, m;4. double min_RelMass;5. for (i=0; i<num_planet-1; i++) {6. m = i;7. min_RelMass = solarPlanets[i].relativeMass;8. for (j=i+1; j<num_planet; j++) {9. if (min_RelMass > solarPlanets[j].relativeMass) {10. m = j;11. min_RelMass = solarPlanets[j].relativeMass;12. }13. } // end inner for14. if (m != i) { // if new minimum found, swap15. temp = solarPlanets[i];16. solarPlanets[i] = solarPlanets[m];17. solarPlanets[m] = temp;18. }19. } // end outer for20. }

Page 28: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 28

Sorting elements in array of structure (2)void sortPlanetsByName(struct Planet solarPlanets[], int num_planet) {1. struct Planet temp;2. int i, j, m;3. char min_Name[10] = {0};4. for (i=0; i<num_planet-1; i++) {5. m = i;6. strcpy(min_Name, solarPlanets[i].name);7. for (j=i+1; j<num_planet; j++) {8. if (strcmp(min_Name, solarPlanets[j].name) > 0) {9. m = j;10. strcpy(min_Name, solarPlanets[j].name);11. }12. } // end inner for13. if (m != i) { // if new minimum found, swap14. temp = solarPlanets[i];15. solarPlanets[i] = solarPlanets[m];16. solarPlanets[m] = temp;17. }18. } // end outer for19.}

Page 29: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 29

1. int main() {2. struct Planet solarSystem[SOLAR_PLANETS] = 3. {{"Mercury", 0.0558, 57.9}, {"Venus", 0.815, 108}, {"Earth",1.0, 150},4. {"Mars", 0.107, 228}, {"Jupiter", 318, 778}, {"Saturn", 95.1, 1430},5. {"Uranus", 14.5, 2870}, {"Neptune", 17.2, 4500}, {"Pluto", 0.11, 5900} };

6. printf("₩n Initial state₩n");7. printPlanets(solarSystem, SOLAR_PLANETS);

8. sortPlanetsByRelMass(solarSystem, SOLAR_PLANETS);9. printf("₩n After sorting by relative mass:₩n");10. printPlanets(solarSystem, SOLAR_PLANETS);

11. sortPlanetsByDist(solarSystem, SOLAR_PLANETS);12. printf("₩n After sorting by distance from sun:₩n");13. printPlanets(solarSystem, SOLAR_PLANETS);

14. sortPlanetsByName(solarSystem, SOLAR_PLANETS);15. printf("₩n After sorting by name using strcmp and strcpy:₩n");16. printPlanets(solarSystem, SOLAR_PLANETS);17. printf("₩n₩n");18. return 0;19. }

Page 30: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 30

result of execution

Page 31: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 31

구조체와 포인터

• 구조체를 가리키는포인터

• 포인터를 멤버로가지는 구조체

순서로 살펴봅시다.

Page 32: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 32

구조체를 가리키는 포인터

구조체를 가리키는 포인터

struct student *p;

struct student s = { 20070001, "홍길동", 4.3 };

p = &s;

printf("학번=%d 이름=%s 학점=%f \n", s.number, s.name, s.grade);printf("학번=%d 이름=%s 학점=%f \n", (*p).number,(*p).name,(*p).grade);

Page 33: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 33

-> 연산자

-> 연산자는 구조체 포인터로 구조체 멤버를 참조할 때사용

struct student *p;

struct student s = { 20070001, "홍길동", 180.2 };

p = &s;

printf("학번=%d 이름=%s 키=%f \n", s.number, s.name, s.grade); printf("학번=%d 이름=%s 키=%f \n", (*p).number,(*p).name,(*p).grade);

printf("학번=%d 이름=%s 키=%f \n", p->number, p->name, p->grade);

Page 34: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 34

-> 연산자

arrow operator

p가 가리키는 구조체 변수

p가 가리키는 구조체 변수의 멤버 number

(*p).number

p가 가리키는 구조체 변수의 멤버 number

p->number==

Page 35: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 35

예제// 포인터를 통한 구조체 참조#include <stdio.h>

struct student {int number;char name[20];double grade;

};

int main(void){

struct student s = { 20070001, "홍길동", 4.3};struct student *p;

p = &s;

printf("학번=%d 이름=%s 키=%f \n", s.number, s.name, s.grade);printf("학번=%d 이름=%s 키=%f \n", (*p).number,(*p).name,(*p).grade);printf("학번=%d 이름=%s 키=%f \n", p->number, p->name, p->grade);

return 0;}

학번=20070001 이름=홍길동 학점=4.300000학번=20070001 이름=홍길동 학점=4.300000학번=20070001 이름=홍길동 학점=4.300000

Page 36: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 36

포인터를 멤버로 가지는 구조체

struct date {int month;int day;int year;

};

struct student {int number;char name[20];double grade;struct date *dob;

};

Page 37: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 37

포인터를 멤버로 가지는 구조체

int main(void){

struct date d = { 3, 20, 1980 };struct student s = { 20070001, "Kim", 4.3 };

s.dob = &d;

printf("학번: %d\n", s.number);printf("이름: %s\n", s.name);printf("학점: %f\n", s.grade);printf("생년월일: %d년 %d월 %d일\n", s.dob->year, s.dob->month, s.dob->day);return 0;

}

학번: 20070001이름: Kim

학점: 4.300000생년월일: 1980년 3월 20일

Page 38: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 38

자기참조 구조체 (Self-referential Structure)

Self-referential structure(자기참조 구조체) a special structure that includes a pointer which points the same

type structure

// definition of data fieldtypedef struct data {

int id;char name[20];char phone[12];

} DATA;

// definition of nodetypedef struct NODE {

DATA data; // data fieldstruct NODE *link; // pointer to next node

} NODE;

Page 39: ch08 - 구조체 (structure) -150415am0845contents.kocw.net/KOCW/document/2015/yeungnam/kimyoungt... · 2016-09-09 · Advanced Networking Tech. Lab. Yeungnam University (yuANTL)Programming

Advanced Networking Tech. Lab.Yeungnam University (yuANTL)

Programming LanguageProf. Young-Tak Kim8 - 39

자기참조 구조체의 예 –Binary Search Tree Node

A node in a binary tree is like a node in a linked list, except it has two node pointer fields:typedef struct TreeNode{

struct NodeData *pNodeData; // data fieldTreeNode *left; // link fieldTreeNode *right; // link field

} TreeNode;A constructor can aid in the creation of nodes