C 프로그래밍
-Part1- 제1장 구조체와 공용체란 무엇인가
1.1 구조체란
1.1 구조체란 배울 내용 ① 구조체 정의 ② 구조체 변수 ③ 구조체 변수로 멤버 변수에 접근하기 ④ 구조체 변수의 초기화 ⑤ 구조체 변수의 복사
1.1 구조체란 (1/18) 구조체 하나 이상의 변수를 묶어 그룹화하는 사용자 정의 자료형
1.1 구조체란 (2/18) 구조체의 정의 struct point { int x; int y; }; ① 구조체의 시작을 알리는 키워드 ② 구조체 이름 struct point { int x; int y; }; ③ 멤버 변수 ③ 멤버 변수 ① 구조체 키워드: 구조체의 시작을 알리는 struct 키워드 지정 ② 구조체 이름: 구조체를 구분하는 이름 ③ 멤버변수: 구조체를 구성하는 구조체 멤버 변수의 이름
1.1 구조체란 배울 내용 ① 구조체 정의 ② 구조체 변수 ③ 구조체 변수로 멤버 변수에 접근하기 ④ 구조체 변수의 초기화 ⑤ 구조체 변수의 복사
1.1 구조체란 (3/18) 구조체 정의, 구조체 변수 선언 – 동시에 #include <stdio.h> struct point { int x; int y; } p1, p2, p3; int main(void) … return 0; }
1.1 구조체란 (4/18) 구조체 정의, 구조체 변수 선언 – 따로 #include <stdio.h> struct point { int x; int y; }; int main(void) struct point p1, p2, p3; … return 0; }
== == 1.1 구조체란 (5/18) 일반 변수 vs. 구조체 변수 int b; c; a; 일반 변수의 선언 int 자료형 변수 int b; c; a; 자료형 변수 일반 변수의 선언 == int a, b, c ; 자료형 변수 struct point p1; 자료형 변수 == 구조체 변수의 선언 struct point p2; struct point p1, p2, p3; struct point p3;
구조체 선언 구조체 선언 형식 struct 태그 { 자료형 멤버1; 자료형 멤버2; ... };
구조체 변수 선언 구조체 정의와 구조체 변수 선언은 다르다.
1.1 구조체란 배울 내용 ① 구조체 정의 ② 구조체 변수 ③ 구조체 변수로 멤버 변수에 접근하기 ④ 구조체 변수의 초기화 ⑤ 구조체 변수의 복사
1.1 구조체란 (6/18)---[1-1.c 실습] #include <stdio.h> struct group // 구조체 정의 { int a; double b; }; int main(void) struct group g1; // 구조체 변수 g1 선언 g1.a=10; // 구조체 변수로 멤버 변수 접근 g1.b=1.1234; // 구조체 변수로 멤버 변수 접근 printf("g1.a의 값: %d \n", g1.a); printf("g1.b의 값: %lf \n", g1.b); return 0; }
1.1 구조체란 (7/18)---[1-1.c 분석] 구조체 변수 g1의 메모리 구조
1.1 구조체란 (8/18)---[1-2.c 실습] #include <stdio.h> struct group // 구조체 정의 { int a; double b; }; int main(void) struct group g1; // 구조체 변수 g1 선언 scanf("%d %lf", &g1.a, &g1.b); // 데이터 입력 printf("g1.a의 값: %d \n", g1.a); printf("g1.b의 값: %lf \n", g1.b); return 0; }
1.1 구조체란 (9/18) 구조체 변수를 사용하는 법 구조체 변수: 멤버 변수에 접근하게 해주는 구조체 변수의 이름을 지정 접근 연산자: 구조체 변수로 멤버 변수에 접근하는 연산자 지정 멤버 변수: 접근하려는 멤버 변수의 이름을 지정
1.1 구조체란 배울 내용 ① 구조체 정의 ② 구조체 변수 ③ 구조체 변수로 멤버 변수에 접근하기 ④ 구조체 변수의 초기화 ⑤ 구조체 변수의 복사
1.1 구조체란 (10/18)---[1-3.c 실습] #include <stdio.h> struct point { int x; int y; }; int main(void) struct point p1={10, 20}; // 구조체 변수의 초기화 printf("%d %d \n", p1.x, p1.y); return 0; }
1.1 구조체란 (11/18)---[1-3.c 분석] 구조체 변수 p1의 메모리 구조
1.1 구조체란 (12/18)---[1-4.c 실습] #include <stdio.h> struct point { int x; int y; }; int main(void) struct point p1={10, 20}; struct point p2={30, 40}; struct point p3={0, 0}; p3.x = p2.x - p1.x; p3.y = p2.y - p1.y; printf("%d %d \n", p3.x , p3.y); return 0; } Y축 10 20 30 40 p1(10,20) p2(30,40) X축 Y축 X축
1.1 구조체란 (13/18)---[1-4.c 분석] 구조체 변수 p1, p2, p3의 메모리 구조 p3 30 p2 40 10 p1.x &p1 20 p1.y p1 30 p2.x &p2 40 p2.y p2 p3.x &p3 p3.y p3
1.1 구조체란 (14/18) 구조체 변수의 초기화 중괄호를 이용한 ‘구조체 변수’의 초기화 시 주의사항 구조체 변수의 선언과 구조체 변수의 초기화를 따로 하면 에러가 발생 struct point p1; p1={10, 20}; // 에러 struct point p1 = {10, 20}; // 정상 struct point p1; p1.x=10; // 정상 p1.y=20; // 정상
1.1 구조체란 배울 내용 ① 구조체 정의 ② 구조체 변수 ③ 구조체 변수로 멤버 변수에 접근하기 ④ 구조체 변수의 초기화 ⑤ 구조체 변수의 복사
1.1 구조체란 (15/18) 구조체 변수의 복사 일반 변수의 복사와 같이 구조체 변수 간 복사 가능 int a=3; int b=0; b=a; // 변수의 복사 printf("%d %d \n", a, b); struct point p1={10, 20}; struct point p2={0, 0}; p2=p1 // 구조체 변수의 복사
1.1 구조체란 (16/18)---[1-5.c 실습] #include <stdio.h> struct point { int x; int y; }; int main(void) struct point p1={10, 20}; struct point p2={0, 0}; p2=p1; // 구조체 변수 p2에 p1을 복사 printf("%d %d \n", p1.x, p1.y); printf("%d %d \n", p2.x, p2.y); return 0; }
1.1 구조체란 (17/18)---[1-5.c 분석] 구조체 변수 간의 복사 10 p2 p1 20 복사 p2.x p1.x p1.y p1 p2.x p2.y p2 복사
1.1 구조체란 (18/18)---[1-6.c 실습] 구조체 변수 간 산술연산 불가능 #include <stdio.h> struct point { int x; int y; }; int main(void) struct point p1={10, 20}; struct point p2={0, 0}; p2+p1; // 에러 p2-p1; // 에러 return 0; } 구조체 변수 간 산술연산 불가능
[1-6-1.c 실습] #include<stdio.h> 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) ) // 올바른 비교 }
EX. 다음과 같이 출력되도록 프로그램을 완성하시오. 1) 학번,이름,학점은 scanf 함수 사용 2) 이름은 배열로 처리 함 struct student { int number; char name[10]; double grade; };
#include <stdio.h> struct 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("학점: %.1lf\n", s.grade); return 0; }
1.2 중첩 구조체
1.2 중첩 구조체 배울 내용 ① 중첩 구조체 ② 중첩 구조체의 초기화 ③ typedef를 이용한 구조체의 재정의
1.2 중첩 구조체 (1/9) 중첩 구조체 구조체 내에 구조체가 포함 ‘구조체 변수를 멤버변수로 사용한다.’
1.2 중첩 구조체 (2/9)---[1-7.c 실습] int main(void) #include <stdio.h> { struct student stu; stu.no=20101323; stu.s.math=90; stu.s.english=80; stu.s.total=stu.s.math+stu.s.english; printf("학번: %d \n", stu.no); printf("총점: %lf \n", stu.s.total); return 0; } #include <stdio.h> struct score { double math; double english; double total; }; struct student int no; struct score s ;
1.2 중첩 구조체 (3/9)---[1-7.c 분석] struct student stu
#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; 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; }
1.2 중첩 구조체 배울 내용 ① 중첩 구조체 ② 중첩 구조체의 초기화 ③ typedef를 이용한 구조체의 재정의
1.2 중첩 구조체 (4/9)---[1-8.c 실습] 중첩 구조체의 초기화 방법 2가지 #include <stdio.h> struct score { double math; double english; double total; }; struct student int no; struct score s; 중첩 구조체의 초기화 방법 2가지 int main(void) { struct student stu={20101323, {90, 80, 0}}; // struct student stu={20101323, 90, 80, 0}; stu.s.total=stu.s.math+stu.s.english; printf("학번: %d \n", stu.no); printf("총점: %lf \n", stu.s.total); return 0; }
1.2 중첩 구조체 (5/9)---[1-8.c 분석] (1) 중첩 중괄호를 사용한 초기화
1.2 중첩 구조체 (6/9)---[1-8.c 분석] (2) 중첩 중괄호를 생략한 초기화
1.2 중첩 구조체 배울 내용 ① 중첩 구조체 ② 중첩 구조체의 초기화 ③ typedef를 이용한 구조체의 재정의
1.2 중첩 구조체 (7/9) typedef의 사용 방법
1.2 중첩 구조체 (8/9)---[1-9.c 실습(1/2)] #include <stdio.h> typedef struct score { double math; double english; double average; } SCORE; struct student int no; SCORE s; // struct socre s; }; typedef struct student STUDENT ; int main(void) { STUDENT stu={20101323, {90, 80, 0}}; stu.s. average=(stu.s.math+stu.s.english)/2; printf("학번: %d \n", stu.no); printf("평균점수: %lf \n", stu.s.average); return 0; }
1.2 중첩 구조체 (9/9)
#include <stdio.h> typedef struct point { int x; int y; } POINT; POINT translate(POINT p, POINT delta); int main(void) { POINT p = { 2, 3 }; POINT delta = { 10, 10 }; POINT result; result = translate(p, delta); printf("새로운 점의 좌표는(%d, %d)입니다.\n", result.x, result.y); return 0; } // translate 함수를 완성하시오.
POINT translate(POINT p, POINT delta) { POINT new_p; new_p.x = p.x + delta.x; new_p.y = p.y + delta.y; return new_p; }
1.3 구조체와 배열
구조체 배열 struct student { int number; char name[20]; double grade; };
1.3 구조체와 배열 배울 내용 ① 멤버 변수로 배열 사용하기 ② 구조체 변수로 배열 사용하기 ③ 멤버 변수로 배열을 사용할 때 주의 사항
1.3 구조체와 배열 (1/7)---[1-10.c 실습(1/2)] #include <stdio.h> struct student { char no[10]; // 학번 (멤버변수에 배열 사용) char name[20]; // 이름 (멤버변수에 배열 사용) double math; // 수학 점수 double english; // 영어 점수 double total; // 총점 }; int main(void) struct student stu1={"20101323", "Park", 80, 80, 0}; // 학생 1의 정보 struct student stu2={"20101324", "Kim", 95, 85, 0}; // 학생 2의 정보 struct student stu3={"20101325", "Lee", 100, 90, 0}; // 학생 3의 정보
1.3 구조체와 배열 (2/7)---[1-10.c 실습(2/2)] stu1.total=stu1.math+stu1.english; printf("학번: %s, 이름: %s \n", stu1.no, stu1.name); printf("총점: %lf \n", stu1.total); printf("\n"); stu2.total=stu2.math+stu2.english; printf("학번: %s, 이름: %s \n", stu2.no, stu2.name); printf("총점: %lf \n", stu2.total); stu3.total=stu3.math+stu3.english; printf("학번: %s, 이름: %s \n", stu3.no, stu3.name); printf("총점: %lf \n", stu3.total); return 0; }
1.3 구조체와 배열 배울 내용 ① 멤버 변수로 배열 사용하기 ② 구조체 변수로 배열 사용하기 ③ 멤버 변수로 배열을 사용할 때 주의 사항
1.3 구조체와 배열 (3/7)---[1-11.c 실습(1/2)] 구조체 변수로 배열 사용 int main(void) { int i=0; struct student stu[3]={ {"20101323", "Park", 80, 80, 0}, {"20101324", "Kim", 95, 85, 0}, {"20101325", "Lee", 100, 90, 0} }; for(i=0; i<3; i++) stu[i].total=stu[i].math+stu[i].english; printf("학번: %s, 이름: %s \n", stu[i].no, stu[i].name); printf("총점: %lf \n", stu[i].total); printf("\n"); } return 0; } #include <stdio.h> struct student { char no[10]; char name[20]; double math; double english; double total; };
1.3 구조체와 배열 (4/7)---[1-11.c 분석]
[array_0f_struct.c 실습] #include <stdio.h> #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); } [array_0f_struct.c 실습]
for(i = 0; i< SIZE; i++) { printf("학번: %d, 이름: %s, 학점: %lf\n", list[i].number, list[i].name, list[i].grade); } return 0;
1.3 구조체와 배열 배울 내용 ① 멤버 변수로 배열 사용하기 ② 구조체 변수로 배열 사용하기 ③ 멤버 변수로 배열을 사용할 때 주의 사항
1.3 구조체와 배열 (5/7)---[1-13.c 실습] <<에러>> 배열의 시작 주소에 문자열을 입력 #include <stdio.h> struct student { char no[10]; // 멤버 변수로 배열 선언 char name[20]; // 멤버 변수로 배열 선언 }; int main(void) struct student stu; stu.no="20101323"; // 에러 stu.name="Park"; // 에러 printf("학번: %s, 이름: %s \n", stu.no, stu.name); return 0; } <<에러>> 배열의 시작 주소에 문자열을 입력
<<에러 해결 1>> 1.3 구조체와 배열 (6/7)---[1-14.c 실습] #include <stdio.h> #include <string.h> struct student { char no[10]; // 멤버 변수로 배열 선언 char name[20]; // 멤버 변수로 배열 선언 }; int main(void) struct student stu; strcpy (stu.no, "20101323"); strcpy (stu.name, "Park"); printf("학번: %s, 이름: %s \n", stu.no, stu.name); return 0; } <<에러 해결 1>> strcpy()함수 사용(PART3-2장 참조)
<<에러 해결 2>> 1.3 구조체와 배열 (7/7)---[참고] #include <stdio.h> struct student { char* no; // 멤버 변수로 포인터 선언 char* name; // 멤버 변수로 포인터 선언 }; int main(void) struct student stu; stu.no = "20101323”; stu.name = "Park“; printf("학번: %s, 이름: %s \n", stu.no, stu.name); return 0; } <<에러 해결 2>> 멤버 변수로 포인터 선언(다음 슬라이드참조)
Ex1.각각의 음식에 대하여 음식의 이름, 칼로리 정보를 구조체로 표현한다 각각의 식사 코스에서 등장하는 음식들을 구조체의 배열로 표현하고 각 식사 코스의 전체 칼로리를 계산하는 프로그램을 작성하시오. #include <stdio.h> struct food { char name[100]; int calories; }; int calc_total_calroies(struct food array[], int size); int main(void) { struct food food_array[3]= {{"hambuger", 900}, {"bulgogi", 500}, {"sushi", 700}};
printf("%d\n", total); return 0; } int calc_total_calroies(struct food array[], int size) { int i, total=0;
int total = calc_total_calroies(food_array, 3); printf("%d\n", total); return 0; } int calc_total_calroies(struct food array[], int size) { int i, total=0; for(i=0;i<size;i++){ total += array[i].calories; return total;
1.4 구조체와 포인터
1.4 구조체와 포인터 ① 멤버 변수로 포인터 사용하기 ② 구조체 변수로 포인터 사용하기 ③ 자기 참조 구조체와 외부 참조 구조체
1.4 구조체와 포인터 (1/15) 멤버 변수로 포인터 사용하기 struct point { int* x; // 멤버 변수로 1차원 포인터 선언 int* y; // 멤버 변수로 1차원 포인터 선언 }; struct point { int* x; // 멤버 변수로 1차원 포인터 선언 int** y; // 멤버 변수로 2차원 포인터 선언 }
1.4 구조체와 포인터 (3/15)---[1-15.c 실습] . 연산자가 *연산자보다 우선순위가 높다 #include <stdio.h> struct point { int* x; // 1차원 포인터 멤버변수 int* y; // 1차원 포인터 멤버변수 }; int main(void) int num1=4; int num2=5; struct point p1; p1.x=&num1; p1.y=&num2; printf("%d %d \n", num1, num2); printf("%d %d \n", *p1.x, *p1.y); return 0; } . 연산자가 *연산자보다 우선순위가 높다
1.4 구조체와 포인터 (4/15)---[1-16.c 실습] #include<stdio.h> struct point { int* x; // 1차원 포인터 멤버변수 int** y; // 2차원 포인터 멤버변수 }; int main(void) int num1 = 3; struct point p1; p1.x = &num1; p1.y = &p1.x; printf("%d %d %d \n", num1, *p1.x, **p1.y); return 0; }
1.4 구조체와 포인터 (5/15)---[1-17.c 실습] #include<stdio.h> struct point { int x; int y; }; int main(void) struct point p1={20,30}; printf("구조체 변수 p1의 주소: %x \n", &p1); printf("멤버 변수 p1.x의 주소: %x \n", &p1.x); return 0; }
포인터를 멤버로 가지는 구조체 struct date { int month; int day; int year; }; struct student { int number; char name[20]; double grade; struct date *dob;
포인터를 멤버로 가지는 구조체 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("학점: %lf\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일
[st-pointer.c 실습] #include <stdio.h> struct date { int month; int day; int year; }; struct student { int number; char name[20]; double grade; struct date *dob; int main(void) { struct date d = { 3, 20, 1980 }; struct student s = { 20070001, "Kim", 4.3 }; s.dob = &d; [st-pointer.c 실습]
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; }
1.4 구조체와 포인터 배울 내용 ① 멤버 변수로 포인터 사용하기 ② 구조체 변수로 포인터 사용하기 ③ 자기 참조 구조체와 외부 참조 구조체
구조체를 가리키는 포인터 구조체를 가리키는 포인터 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);
-> 연산자 -> 연산자는 구조체 포인터로 구조체 멤버를 참조할 때 사용 struct student s = { 20070001, "홍길동", 180.2 }; 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);
-> 연산자 ==
[pointer_to_st.c 실습] // 포인터를 통한 구조체 참조 #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; } [pointer_to_st.c 실습]
1.4 구조체와 포인터 (6/15)---[1-18.c 실습] #include<stdio.h> struct student { char no[10]; // 학번 char name[20]; // 이름 double total; // 총점 }; int main(void) struct student stu = {"20101323", "Park", 160}; struct student* p=NULL; // 1차원 구조체 포인터 변수 선언 p = &stu; printf("%s %s %lf \n",stu.no, stu.name, stu.total); printf("%s %s %lf \n",(*p).no, (*p).name, (*p).total); printf("%s %s %lf \n",p->no, p->name, p->total); return 0; }
1.4 구조체와 포인터 (7/15)---[1-19.c 실습(1/2)] #include<stdio.h> struct student { char no[10]; // 학번 char name[20]; // 이름 double total; // 총점 }; int main(void) struct student stu = {"20101323", "Park", 160}; struct student* p=NULL; struct student** pp=NULL;
1.4 구조체와 포인터 (8/15)---[1-19.c 실습(2/2)] p = &stu; pp = &p; printf("%s %s %lf \n",stu.no, stu.name, stu.total); printf("%s %s %lf \n",(*p).no, (*p).name, (*p).total); printf("%s %s %lf \n",p->no, p->name, p->total); printf("%s %s %lf \n",(**pp).no, (**pp).name, (**pp).total); printf("%s %s %lf \n",(*pp)->no, (*pp)->name, (*pp)->total); return 0; }
1.4 구조체와 포인터 배울 내용 ① 멤버 변수로 포인터 사용하기 ② 구조체 변수로 포인터 사용하기 ③ 자기 참조 구조체와 외부 참조 구조체
1.4 구조체와 포인터 (9/15) 구조체 내에서 자기 구조체 참조 구조체 내에서 외부 구조체 참조
1.4 구조체와 포인터 (10/15)---[1-20.c 실습(1/2)] #include<stdio.h> struct student { char name[20]; // 이름 int money; // 나이 struct student* link; // 자기 참조 구조체 포인터 변수 }; int main(void) struct student stu1 = {"Kim", 90, NULL}; struct student stu2 = {"Lee", 80, NULL}; struct student stu3 = {"Goo", 60, NULL};
1.4 구조체와 포인터 (11/15)---[1-20.c 실습(2/2)] stu1.link = &stu2; stu2.link = &stu3; printf("%s %d \n", stu1.name, stu1.money); printf("%s %d \n", stu1.link->name, stu1.link->money); printf("%s %d \n", stu1.link->link->name, stu1.link->link->money); return 0; }
1.4 구조체와 포인터 (12/15)---[1-21.c 실습(1/2)] struct student { char name[20]; int money; struct student* left_link; struct student* right_link; }; struct student stu1 = {"Kim", 90, NULL, NULL}; struct student stu2 = {"Lee", 80, NULL, NULL}; struct student stu3 = {"Goo", 60, NULL, NULL};
1.4 구조체와 포인터 (13/15)---[1-21.c 실습(2/2)] stu1.left_link = &stu2; stu1.right_link= &stu3; printf("%s %d \n", stu1.name, stu1.money); printf("%s %d \n", stu1.left_link->name, stu1.left_link->money); printf("%s %d \n", stu1.right_link->name, stu1.right_link->money);
1.4 구조체와 포인터 (14/15)---[1-22.c 실습(1/2)] #include<stdio.h> struct point { int x; // x좌표 int y; // y좌표 }; struct student { char name[20]; struct point* link; int main(void) { struct student stu1 = {"Kim", NULL}; struct student stu2 = {"Lee", NULL}; struct point p1 = {30, 40}; struct point p2 = {60, 80}; stu1.link = &p1; stu2.link = &p2; printf("%s %d %d \n", stu1.name, stu1.link->x, stu1.link->y); printf("%s %d %d \n", stu2.name, stu2.link->x, stu2.link->y); return 0; }
1.4 구조체와 포인터 (15/15)---[1-22.c 분석]
#include <stdio.h> struct student { int number; char name[10]; double grade; struct student *next; }; int main(void) { struct student s1 = { 30, "Kim", 4.3, NULL }; struct student s2 = { 31, "Park", 3.7, NULL }; struct student *first = NULL; struct student *current = NULL; first = &s1; s1.next = &s2; s2.next = NULL; current = first; while( current != NULL ) // 나머지 부분을 완성 하시오.
{ printf("학생의 번호=%d 이름=%s, 성적=%f\n", current->number, current->name, current->grade); current = current->next; }
1.5 구조체와 함수
1.4 구조체와 포인터 배울 내용 ① 구조체를 함수의 인자로 전달하기 – 값에 의한 호출과 주소에 의한 호출 ① 구조체를 함수의 인자로 전달하기 – 값에 의한 호출과 주소에 의한 호출 ② 구조체를 함수의 반환형으로 전달하기 – 값 반환과 주소 반환
1.5 구조체와 함수 (1/10) 값에 의한 호출(Call by value) 구조체의 복사본이 함수로 전달 된다
1.5 구조체와 함수 (2/10)---[1-23.c 실습] #include<stdio.h> struct point // 구조체 정의 { int x; int y; }; void function (struct point call); // 함수의 선언 int main(void) struct point p = {10, 20}; function(p); // 값에 의한 호출(call by value) return 0; } void function (struct point call) // 함수의 정의 printf("%d %d \n", call.x, call.y); // 10, 20 출력
1.5 구조체와 함수 (3/10)---[1-23.c 분석] int main(void) { struct point p = { 10, 20 }; function ( p ); … } p는 call에 복사됨 void function (struct point call) { printf("%d %d \n", call.x, call.y);}
1.5 구조체와 함수 (4/10) 주소에 의한 호출 (call by reference)
1.5 구조체와 함수 (5/10)---[1-24.c 실습] #include<stdio.h> struct point { int x; int y; }; void function (struct point* call); // 함수의 선언 int main(void) struct point p = {10, 20}; function(&p); // 주소에 의한 호출(call by reference) return 0; } void function (struct point* call) // 함수의 정의 printf("%d %d \n", call->x, call->y); printf("%d %d \n", (*call).x, (*call).y);
1.5 구조체와 함수 (6/10)---[1-24.c 분석] int main(void) { struct point p = { 10, 20 }; function ( &p ); … } p의 주소가 포인터 변수 call에 저장 void function (struct point* call) { printf("%d %d \n", call->x, call->y); printf("%d %d \n", (*call).x, (*call).y); }
1.4 구조체와 포인터 배울 내용 ① 구조체를 함수의 인자로 전달하기 – 값에 의한 호출과 주소에 의한 호출 ① 구조체를 함수의 인자로 전달하기 – 값에 의한 호출과 주소에 의한 호출 ② 구조체를 함수의 반환형으로 전달하기 – 값 반환과 주소 반환
1.5 구조체와 함수 (7/10) 구조체의 값(value)을 반환(return)하는 함수 함수의 반환형: 구조체 값 반환 struct point function ( ) { struct point p={10, 20}; return p; } 함수의 반환형: 구조체 값 반환 ① 반환 형태 ② 구조체 변수 이름
1.5 구조체와 함수 (8/10)---[1-25.c 실습] #include<stdio.h> struct point { int x; int y; }; struct point function(void); // 함수의 선언 int main(void) struct point p; p = function(); // 함수 호출 printf("%d %d \n", p.x, p.y); return 0; } struct point function(void) // 함수의 정의 struct point call = {10, 20}; return call; // 구조체 변수 call 반환
1.5 구조체와 함수 (9/10) 구조체 주소(reference)를 반환(return)하는 함수 struct point* function ( ) { static struct point p={10, 20}; return &p; } 함수의 반환형: 구조체 주소반환 ① 반환 형태 ② 구조체 변수의 주소
1.5 구조체와 함수 (10/10)---[1-26.c 실습] #include<stdio.h> struct point { int x; int y; }; struct point* function(void); // 함수의 선언 int main(void) struct point *p; p = function(); // 함수 호출 printf("%d %d \n", p->x, p->y); printf("%d %d \n", (*p).x,(*p).y); return 0; } struct point* function(void) // 함수의 정의 static struct point* call = {10, 20}; return &call; // 구조체 변수 call의 주소 반환
수고 하셨습니다