Microsoft PowerPoint - chap10-함수의활용.pptx

Similar documents
Microsoft PowerPoint - chap12-고급기능.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap11-포인터의활용.pptx

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - chap05-제어문.pptx

Microsoft PowerPoint - chap04-연산자.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap03-변수와데이터형.pptx

슬라이드 1

금오공대 컴퓨터공학전공 강의자료

untitled

Microsoft PowerPoint - chap01-C언어개요.pptx

02장.배열과 클래스

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

설계란 무엇인가?

Microsoft PowerPoint - ch07 - 포인터 pm0415

11장 포인터

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

OCW_C언어 기초

PowerPoint Presentation

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

: 1 int arr[9]; int n, i; printf(" : "); scanf("%d", &n); : : for(i=1; i<10; i++) arr[i-1] = n * i; for(i=0; i<9; i++) if(i%2 == 1) print

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - 제11장 포인터(강의)

untitled

설계란 무엇인가?

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - 06_(C_Programming)_(Korean)_Characters_Strings

untitled

Microsoft PowerPoint - chap06-5 [호환 모드]

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

Microsoft PowerPoint - chap-11.pptx

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

11장 포인터


Microsoft PowerPoint - chap06-1Array.ppt

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

C 언어 프로그래밊 과제 풀이


untitled

KNK_C_05_Pointers_Arrays_structures_summary_v02

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

PowerPoint 프레젠테이션

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Data Structure

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chapter_08.pptx

중간고사

Microsoft PowerPoint - chap06-4 [호환 모드]

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

C++ Programming

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint Presentation

11장 포인터

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - additional01.ppt [호환 모드]

쉽게 풀어쓴 C 프로그래밍

목차 배열의개요 배열사용하기 다차원배열 배열을이용한문자열다루기 실무응용예제 C 2

Microsoft PowerPoint - Chapter8.pptx

Microsoft PowerPoint - 04_C_Language_Function

Microsoft PowerPoint - ch08 - 구조체 (structure) am0845

1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, dou

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

4. 1 포인터와 1 차원배열 4. 2 포인터와 2 차원배열 4. 3 포인터배열 4. 4 포인터와문자그리고포인터와문자열

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chapter_09.pptx

K&R2 Reference Manual 번역본

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

C 프로그래밊 개요

03장.스택.key

13 주차문자열의표현과입출력

Microsoft PowerPoint - 제9강 문자열

PowerPoint 프레젠테이션

OCW_C언어 기초

Microsoft PowerPoint - [2009] 02.pptx

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

歯7장.PDF

untitled

chap7.PDF

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - chap-09.pptx

금오공대 컴퓨터공학전공 강의자료

Frama-C/JESSIS 사용법 소개

C 언어와 프로그래밍 개요

OCW_C언어 기초

8장. 포인터

<4D F736F F F696E74202D20C1A639C0E520C7D4BCF6BFCDBAAFBCF6>

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

int main(void) int a; int b; a=3; b=a+5; printf("a : %d \n", a); printf("b : %d \n", b); a b 3 a a+5 b &a(12ff60) &b(12ff54) 3 a 8 b printf(" a : %x \

Chapter_06

Infinity(∞) Strategy

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

C 프로그래밊 개요

Microsoft PowerPoint - Chapter_07.pptx

Microsoft PowerPoint - 10장 문자열 pptx

Transcription:

#include <stdio.h> int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과 포인터에 의한 전달 방법 에 대해 알아본다. 함수의 인자로 배열과 구조체를 전달하는 방법을 알아본다. 재귀 함수의 개념과 재귀 함수를 정의하고 호출하는 방법을 알아본다. 변수의 를 지정하는 auto, register, static, extern에 대해 알아본다. 표준 C 라이브러리 함수에 대해 알아본다. 2

목차 값에 의한 전달, 포인터에 의한 전달 배열의 전달, 구조체의 전달 재귀 함수 재귀 함수의 정의 재귀 함수와 반복문 auto, register, extern, static 함수의 범위 표준 C 라이브러리 함수 수학 관련 함수, 문자열 처리 함수, 문자 분류 함수, 데이터 변환 함수, 메모리 관련 함수, 시간 관련 함수 3 값에 의한 전달 값에 의한 전달 함수를 호출할 때 넘겨주는 인자의 값을 함수 정의에 있는 매개변수로 복사해서 전달하는 방식 4

값에 의한 전달 Swap 함수 - 값에 의한 전달 방법(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: /* Ex10_01.c */ #include <stdio.h> void Swap(int x, int y); Swap 함수의 선언 int main(void) { int a = 10; int b = 20; printf("swap 전의 a = %d, b = %d\n", a, b); Swap(a, b); Swap 함수의 호출 printf("swap 후의 a = %d, b = %d\n", a, b); } return 0; 5 값에 의한 전달 Swap 함수 - 값에 의한 전달 방법(2/2) 20: void Swap(int x, int y) 21: { 22: int temp; 23: 24: temp = x; 25: x = y; 26: y = temp; 27: } Swap 함수의 정의 Swap 함수를 호출해도 a, b의 값에 변화가 없다. 함수 안에서 변경되어야 하 는 인자는 값으로 전달해서 는 안 된다. 6

포인터에 의한 전달 Swap 함수 - 포인터에 의한 전달 방법(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: /* Ex10_01.c */ #include <stdio.h> void Swap(int *x, int *y); Swap 함수의 선언 int main(void) { int a = 10; int b = 20; printf("swap 전의 a = %d, b = %d\n", a, b); Swap(&a, &b); Swap 함수의 호출 printf("swap 후의 a = %d, b = %d\n", a, b); } return 0; 7 포인터에 의한 전달 Swap 함수 - 포인터에 의한 전달 방법(2/2) 20: void Swap(int *x, int *y) 21: { 22: int temp; 23: 24: temp = *x; 25: *x = *y; 26: *y = temp; 27: } Swap 함수의 정의 Swap 호출 후 a, b의 값이 올바르게 맞교환 되었다. 8

포인터에 의한 전달 포인터에 의한 전달 방법(1/2) Swap 함수처럼 함수 안에서 변경되어야 하는 인자를 전달할 때는 포인터에 의한 전달 방법을 사용해야 한다. 변수의 값을 복사해서 전달하는 대신 변수의 주소를 전달하는 방식 출력인자나 입출력 인자를 전달할 때 사용 9 포인터에 의한 전달 포인터에 의한 전달 방법(2/2) 포인터에 의한 전달 방법을 이용하면 함수의 처리 결과를 인자로 받아올 수 있다. 10

포인터에 의한 전달 인자의 의미 입력 인자(in-parameter) : 함수 안에서 사용만 될 뿐 변경되지 않는 인자 출력 인자(out-parameter) : 함수 안에서 사용되지는 않고 변경되는 인자 입출력 인자(inout-parameter) : 함수 안에서 사용도 되고, 변경도 되는 인자 11 포인터에 의한 전달 출력 인자의 사용 예(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: /* Ex10_03.c */ #include <stdio.h> void GetSumProduct(int x, int y, int *sum, int *product); GetSumProduct 함수의 선언 int main(void) { int a = 5, b = 8; int res1, res2; GetSumProduct(a, b, &res1, &res2); GetSumProduct 함수의 호출 printf("%d + %d = %d\n", a, b, res1); printf("%d + %d = %d\n", a, b, res2); } return 0; 12

포인터에 의한 전달 출력 인자의 사용 예(2/2) 19: void GetSumProduct(int x, int y, int *sum, int *product) 20: { 21: *sum = x + y; 22: *product = x * y; 23: } sum과 product는 출력인자 13 포인터에 의한 전달 출력 인자함수의 처리 결과를 받아오는 과정(1/2) 함수를 선언할 때, 처리 결과를 받아올 매개변수를 포인터형으로 선언한다. 함수를 호출할 때, 처리 결과를 받아올 변수의 주소를 인자로 전달한다. 함수를 정의할 때, 매개변수가 가리키는 곳에 함수의 처리 결과를 저장한다. 14

포인터에 의한 전달 출력 인자함수의 처리 결과를 받아오는 과정(2/2) 15 배열의 전달 기본적인 배열의 전달(1/4) 배열은 항상 포인터로 전달한다. 함수의 매개변수는 배열의 원소에 대한 포인터형으로 선언한다. 함수의 인자로 배열을 전달할 때는 포인터를 전달하고, 함수 안에서는 일반 배열 인 것처럼 인덱스로 사용하면 된다. 16

배열의 전달 기본적인 배열의 전달(2/4) 함수를 호출할 때는, [ ] 없이 배열명만 인자로 넘겨준다. 함수 안에서 배열의 크기가 필요할 때는, 배열의 크기도 인자로 전달한다. 17 배열의 전달 기본적인 배열의 전달(3/4) 18

배열의 전달 기본적인 배열의 전달(4/4) 특정 원소의 주소 전달 시 배열의 일부분을 인자로 전달할 수도 있다. 19 배열의 전달 함수의 인자로 배열을 전달하는 경우의 예(1/3) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: /* Ex10_04.c */ #include <stdio.h> void PrintArray(int *arr, int size); int GetSumOfArray(int *arr, int size); 배열을 인자로 갖는 함수의 선언 int main(void) { int x[5] = {10, 20, 30, 40, 50}; int y[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; printf("x 배열 : "); PrintArray(x, 5); printf("합계 : %d\n\n", GetSumOfArray(x, 5)); 함수의 인자로 배열 전달 20

배열의 전달 함수의 인자로 배열을 전달하는 경우의 예(2/3) 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: } printf("y 배열 : "); PrintArray(y, 10); printf("합계 : %d\n\n", GetSumOfArray(y, 10)); 함수의 인자로 배열 전달 printf("y 배열의 일부분 : "); PrintArray(y+2, 5); printf("합계 : %d\n\n", GetSumOfArray(y+2, 5)); 함수의 인자로 배열 전달 return 0; void PrintArray(int *arr, int size) { int i; } for(i = 0 ; i < size ; i++) printf("%d ", arr[i]); printf("\n"); 인자로 전달받은 배열의 사용 21 배열의 전달 함수의 인자로 배열을 전달하는 경우의 예(3/3) 35: 36: int GetSumOfArray(int *arr, int size) 37: { 38: int i; 39: int total; 40: 41: for(i = 0, total = 0 ; i < size ; i++) 인자로 전달받은 42: total += arr[i]; 배열의 사용 43: 44: return total; 45: } 22

배열의 전달 배열을 인자로 갖는 함수의 원형 매개변수의 데이터형으로 배열의 원소에 대한 포인터형을 지정하거나, 크기를 생 략한 배열을 지정할 수 있다. 23 배열의 전달 배열을 입력 인자로 전달하는 경우(1/2) 배열이 함수 안에서 이용만 될 뿐 변경되지 않을 때는 매개변수의 포인터형에 const를 지정한다. 함수의 매개변수가 const 포인터이면, 함수 안에서 포인터가 가리키는 변수의 값 을 읽을 수만 있고 변경할 수는 없다. 24

배열의 전달 배열을 입력 인자로 전달하는 경우(2/2) 25 배열의 전달 배열을 입력 인자나 입출력 인자로 전달하는 경우(1/3) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: /* Ex10_05.c */ #include <stdio.h> void PrintArray(const int *arr, int size); void SortArray(int *arr, int size); 배열을 입력 인자로 갖는 함수의 선언 배열을 입출력 인자로 갖는 함수의 선언 int main(void) { int x[5] = {43, 6, 24, 88, 34}; int y[10] = {12, 35, 7, 45, 78, 22, 98, 77, 1, 28}; printf("x 배열 : "); PrintArray(x, 5); SortArray(x, 5); printf("정렬후 : "); PrintArray(x, 5); 26

배열의 전달 배열을 입력 인자나 입출력 인자로 전달하는 경우(2/3) 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: printf("y 배열 : "); PrintArray(y, 10); SortArray(y, 10); printf("정렬후 : "); PrintArray(y, 10); } return 0; void PrintArray(const int *arr, int size) { int i; } //arr[0] = 100; for(i = 0 ; i < size ; i++) printf("%d ", arr[i]); printf("\n"); 배열을 입력 인자로 갖는 함수의 정의 배열을 const int *형으로 전달했으므로 변경 불가 27 배열의 전달 배열을 입력 인자나 입출력 인자로 전달하는 경우(3/3) 37: void SortArray(int *arr, int size) 38: { 39: int i, j, index; 40: int temp; 41: 42: for(i = 0; i < size-1 ; i++) 43: { 44: index = i; 45: for( j = i+1 ; j < size ; j++) 46: { 47: if( arr[index] > arr[ j] ) 48: index = j; 49: } 50: temp = arr[i]; 51: arr[i] = arr[index]; 52: arr[index] = temp; 53: } 54: } 배열을 입출력 인자로 갖는 함수의 정의 배열을 int *형으로 전달했으므로 변경 가능 28

배열의 전달 배열의 전달(1/2) 배열을 인자로 전달하려면, 매개변수의 데이터형으로 포인터형을 사용하거나 크 기를 생략한 배열로 선언한다. 함수 안에서 배열이 사용만 될 뿐 변경되지 않을 때는 const 포인터로 전달한다. 함수 안에서 배열의 크기가 필요할 때는 배열의 크기도 인자로 전달한다. 29 배열의 전달 배열의 전달(2/2) 배열을 인자로 갖는 함수를 호출할 때는, 배열의 시작 주소를 인자로 넘겨준다. 필요하다면 배열의 크기도 함께 전달한다. 배열을 인자로 갖는 함수를 정의할 때는, 매개변수인 포인터를 배열 이름인 것처 럼 사용한다. 30

구조체의 전달 구조체를 값으로 전달하는 경우(1/2) 구조체를 값으로 전달하면 인자 전달 과정에서 구조체 변수가 복사되어 전달된다. 31 구조체의 전달 구조체를 값으로 전달하는 경우(2/2) 32

구조체의 전달 구조체를 포인터로 전달하는 경우(1/2) 구조체를 복사하는 대신 구조체의 주소만 전달하므로 불필요한 구조체의 복사를 막을 수 있다. 크기가 큰 구조체는 포인터로 전달하는 것이 성능상 좋다. 33 구조체의 전달 구조체를 포인터로 전달하는 경우(2/2) 34

구조체의 전달 함수의 인자로 구조체를 전달하는 경우(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: /* Ex10_06.c */ #include <stdio.h> typedef struct point { int x; int y; } POINT; POINT 구조체의 정의 구조체를 인자로 갖는 함수의 선언 void PrintPoint(POINT *p); int main(void) { POINT p1 = {100, 200}; PrintPoint(&p1); } 구조체를 포인터로 전달 return 0; 35 구조체의 전달 함수의 인자로 구조체를 전달하는 경우(2/2) 19: void PrintPoint(POINT *p) 20: { 21: printf("(%d, %d)\n", p->x, p->y); 22: } 구조체를 인자로 갖는 함수의 정의 36

구조체의 전달 구조체를 입력 인자로 전달하는 경우(1/2) 구조체가 함수 안에서 이용만 될 뿐 변경되지 않을 때는 const 포인터로 전달한다. 함수의 매개변수가 const 포인터이면, 함수 안에서 포인터가 가리키는 구조체 변수 의 값을 읽어볼 수만 있고 변경할 수는 없다. 37 구조체의 전달 구조체를 입력 인자로 전달하는 경우(2/2) 38

구조체의 전달 구조체를 출력 인자나 입출력 인자로 전달하는 경우 구조체를 함수의 출력 인자나 입출력 인자로 전달할 때는 포인터에 의한 전달 방법 을 사용한다. 구조체 포인터로 구조체 멤버에 접근할 때는 -> 연산자를 이용한다. 39 구조체의 전달 구조체를 입력 인자, 입출력 인자로 전달하는 경우(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* Ex10_07.c */ #include <stdio.h> typedef struct point { int x; int y; } POINT; void PrintPoint(const POINT *p); void MovePoint(POINT *p, int dx, int dy); 구조체를 입력 인자로 갖는 함수의 선언 구조체를 입출력 인자로 갖는 함수의 선언 int main(void) { POINT p1 = {100, 200}; POINT p2 = {300, 400}; printf("p1 = "); PrintPoint(&p1); printf("p2 = "); PrintPoint(&p2); 40

구조체의 전달 구조체를 입력 인자, 입출력 인자로 전달하는 경우(2/2) 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: MovePoint(&p1, 10, 10); printf("변경된 p1의 좌표: "); PrintPoint(&p1); } return 0; void PrintPoint(const POINT *p) { 구조체를 const POINT*형으로 전달했으므로 변경 불가 //p->x = 100; printf("(%d, %d)\n", p->x, p->y); } void MovePoint(POINT *p, int dx, int dy) { p->x += dx; p는 입출력 인자이므로 변경 가능 p->y += dy; } 41 구조체의 전달 구조체의 전달(1/2) 구조체를 인자로 갖는 함수를 선언할 때는, 포인터로 전달하는 것이 좋다. 함수 안에서 구조체가 사용만 될 뿐 변경되지 않을 때는 const 포인터로 전달한다. 구조체를 인자로 갖는 함수를 호출할 때는, 구조체 변수의 주소를 인자로 넘겨준다. 42

구조체의 전달 구조체의 전달(2/2) 구조체를 인자로 갖는 함수를 정의할 때는, 매개변수인 포인터를 이용해서 구조 체의 멤버에 접근한다. 43 재귀 함수 재귀 함수의 정의 재귀 함수(recursive function) 자기 자신을 다시 호출하는 함수 큰 문제를 비슷한 종류의 작은 문제들로 나누어 처리하는 분할 정복(divide-andconquer) 알고리즘을 구현할 때 주로 사용 재귀 기법(recursion) 어떤 문제를 비슷한 유형의 다른 문제로 바꾸어 처리하는 방법 44

재귀 함수 재귀 함수의 정의 재귀 함수의 정의 팩토리얼을 구하는 함수 45 46 재귀 함수 재귀 함수의 정의 재귀 함수의 호출 과정

재귀 함수 재귀 함수의 정의 GetFactorial을 재귀 함수로 정의하는 경우(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: /* Ex10_08.c */ #include <stdio.h> int GetFactorial(int n); 재귀 함수의 선언 int main(void) { int num; printf("정수를 입력하세요 : "); scanf("%d", &num); printf("%d! = %d\n", num, GetFactorial(num)); } 재귀 함수의 호출 return 0; 47 재귀 함수 재귀 함수의 정의 GetFactorial을 재귀 함수로 정의하는 경우(2/2) 18: int GetFactorial(int n) 19: { 20: if( n <= 1 ) 21: return 1; 22: 23: return n * GetFactorial(n-1); 24: } 재귀 함수의 정의 48

재귀 함수 재귀 함수와 반복문 재귀 함수와 반복문 재귀 함수보다 반복문으로 구현하는 것이 성능 면에서는 더 좋다. 재귀 함수를 호출하면 함수가 여러 번 반복적으로 호출되므로, 함수 호출시 오버헤드가 크다. 재귀 기법은 문제를 해결하기 위한 알고리즘을 단순화한다. 재귀 함수 호출 시 함수 호출의 깊이(depth)가 너무 깊어지지 않도록 주의한다. 49 (storage class) 변수나 변수나 변수나 변수의 함수를 선언할 때 사용되는 키워드 함수의 저장 위치와 사용 범위를 결정한다. 함수 선언 시 맨 앞에 지정한다. 디폴트 는 auto이고, 함수의 디폴트 는 extern이다. 50

auto 변수 auto 변수 지역 변수는 디폴트로 auto 를 사용한다. auto 지역 변수는 선언된 위치에서 자동으로 생성되고 선언된 블록을 빠져나갈 때 자동으로 해제된다. 전역 변수에는 auto를 지정할 수 없다. 51 register 변수 register 변수 변수를 메모리에 할당하는 대신 CPU의 레지스터에 할당한다. 변수를 레지스터에 할당하면 변수에 좀더 빠르게 접근할 수 있다. 보통 루프 제어 변수를 레지스터 변수로 선언한다. register 변수로 선언해도 변수가 레지스터에 할당되지 않을 수 있다. 레지스터 변수에 대해서는 주소 구하기 연산자를 사용할 수 없다. 52

extern 변수 extern 변수 다른 곳에 선언된 변수에 대하여 별도의 메모리 할당 없이 해당 변수의 이름을 사 용할 수 있게 해준다. 전역 변수를 코드 중간에 선언하면, 전역 변수가 선언된 뒤쪽에 정의된 함수에서 만 전역 변수를 사용할 수 있다. 53 extern 변수 전방 선언(forward declaration) 전역 변수에 대한 extern 선언이 있으면 실제로 전역 변수가 선언된 위치에 관계 없이 전역 변수를 사용할 수 있다. 54

extern 변수 전역 변수의 extern 선언 전역 변수에 대한 extern 선언이 있으면 실제로 전역 변수가 선언된 위치에 관계 없이 전역 변수를 사용할 수 있다. 55 static 변수 static 지역 변수(1/) 정적 지역 변수는 함수가 리턴하더라도 해제되지 않고 남아있다가 그 다음 번 함 수 호출에 다시 이용된다. 56

static 변수 정적 지역 변수의 사용 예(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: /* Ex10_09.c */ #include <stdio.h> void TestStatic(void); int main(void) { int i; for(i = 0 ; i < 5 ; i++) TestStatic( ); } TestStatic 함수를 다섯 번 호출 return 0; 57 static 변수 정적 지역 변수의 사용 예(2/2) 16: void TestStatic(void) 17: { 18: int num = 0; 지역 변수의 선언 19: static int count = 0; 정적 지역 변수의 선언 20: 21: printf("num = %d, ", ++num); 22: printf("count = %d\n", ++count); 23: } 58

static 변수 static 지역 변수(2/) 정적 지역 변수는 전역 변수처럼 프로그램이 시작할 때 메모리에 할당되고 프로 그램이 종료할 때 해제된다. 전역 변수와는 달리 정적 지역 변수는 선언된 함수 안에서만 사용할 수 있다. 59 static 변수 정적 지역 변수가 필요한 경우(1/2) 문자열을 역순으로 만들어서 리턴하는 함수 포인터를 리턴하는 함수를 정의할 때는 함수 안에 선언된 지역 변수의 주소를 리턴하지 않도록 주의해야 한다. 60

static 변수 정적 지역 변수가 필요한 경우(2/2) Reverse 함수 안에 있는 지역 변수 result를 정적 지역 변수로 선언한다. result를 정적 지역 변수로 선언하면 함 수가 리턴하더라도 해제되지 않으므로 올바른 실행 결과를 얻을 수 있다. 61 static 변수 지역 변수의 주소를 리턴하는 경우(1/3) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: /* Ex10_10.c */ #include <stdio.h> #include <string.h> char* Reverse(const char *str); char*형을 리턴하는 함수의 선언 int main(void) { char s1[ ] = "abc"; char *res = NULL; res = Reverse(s1); printf("res = %s\n", res); } char*형을 리턴하는 함수의 호출 return 0; 62

static 변수 지역 변수의 주소를 리턴하는 경우(2/3) 18: char* Reverse(const char *str) char*형을 리턴하는 함수의 정의 19: { 20: char result[80]; 21: int i; 22: int len = strlen(str); 23: 24: for( i = 0 ; i < len ; i ++) 25: result[i] = str[len - i - 1]; 26: result[i] = '\0'; 27: 해제된 지역 변수의 지역 변수의 주소 리턴 28: return result; 주소를 리턴하므로 29: } 실행 에러가 발생한다. 63 static 변수 지역 변수의 주소를 리턴하는 경우(3/3) 64

static 변수 정적 지역 변수의 주소를 리턴하는 경우(1/3) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: /* Ex10_11.c */ #include <stdio.h> #include <string.h> char* Reverse(const char *str); char*형을 리턴하는 함수의 선언 int main(void) { char s1[ ] = "abc"; char *res = NULL; res = Reverse(s1); printf("res = %s\n", res); } char*형을 리턴하는 함수의 호출 return 0; 65 static 변수 정적 지역 변수의 주소를 리턴하는 경우(2/3) 18: char* Reverse(const char *str) char*형을 리턴하는 함수의 정의 19: { 20: static result[80]; 정적 지역 변수의 주소 리턴 21: int i; 22: int len = strlen(str); 23: 24: for( i = 0 ; i < len ; i ++) 25: result[i] = str[len - i - 1]; 26: result[i] = '\0'; 27: 정적 지역 변수의 주소 리턴 28: return result; 29: } 정적 지역 변수를 이용 하면 올바른 실행 결과 를 얻을 수 있다. 66

static 변수 정적 지역 변수의 주소를 리턴하는 경우(3/3) 67 static 변수 Reverse 함수를 구현하는 또 다른 방법 함수를 호출할 때 결과를 받아올 문자 배열의 주소를 출력 인자로 전달하고, 함수 안에서는 매개변수로 전달된 배열에 역순으로 된 문자열을 저장한다. 68

static 변수 static 전역 변수 정적 전역 변수는 정적 전역 변수가 선언된 소스 파일에서만 사용할 수 있다. 정적 전역 변수는 전역 변수를 다른 소스 파일에서 접근하지 못하도록 제한한다. 69 static 변수 지역 변수, 정적 지역 변수, 전역 변수, 정적 전역 변수의 비교 70

함수의 범위 함수의 범위 함수의 디폴트 는 extern이다. 해당 함수를 다른 소스 파일에서 접근할 수 있다. 정적 함수 : 함수가 정의된 소스 파일에서만 함수를 호출할 수 있고, 다른 소스 파 일에서는 호출할 수 없다. 71 표준 C 라이브러리 함수 표준 C 라이브러리 C 컴파일러가 필수로 제공하는 플랫폼 독립적인 함수 집합이다. 표준 C 라이브러리의 대표적인 기능 수학 관련 : abs( ), pow( ), sqrt( ), rand( ) 등 문자열 처리 : strcpy( ), strlen( ), strcmp( ), strcat( ) 등 문자 분류 : isalnum, isdigit( ), isalpha( ) 등 데이터 변환 : tolower( ), toupper( ) 등 메모리 관련 : memcpy( ), memset( ), memmove( ) 등 시간 처리 : time( ), localtime( ), asctime( ) 등 72

표준 C 라이브러리 함수 수학 관련 함수 수학 관련 함수 : <math.h> 포함 73 표준 C 라이브러리 함수 문자열 처리 함수 문자열 처리 함수: <string.h> 포함 74

표준 C 라이브러리 함수 문자 분류함수 문자 분류 함수: <ctype.h> 포함 75 표준 C 라이브러리 함수 데이터 변환 함수 데이터 변환 함수: <stdlib.h>나 <ctype.h> 포함 76

표준 C 라이브러리 함수 메모리 관련 함수 메모리 관련 함수: <memory.h> 포함 77 표준 C 라이브러리 함수 시간 관련 함수 시간 관련 함수: <time.h> 포함 78

학습정리 값에 의한 전달: 함수 안에서 변경되지 않는 인자(입력 인자)를 전달할 때 사용 포인터에 의한 전달 : 함수 안에서 변경되어야 하는 인자(출력 인자)를 전달할 때 사용 매개변수는 포인터 형으로 선언하고, 함수 호출 시 변수의 주소를 전달한다. 함수 안에서는 매개변수가 가리키는 곳에 값을 저장한다. void GetSumProduct(int x, int y, int *sum, int *product) { *sum = x + y; *product = x * y; } 배열의 전달: 배열은 포인터로 전달한다. 함수 안에서 변경되지 않는 배열을 전달할 때는 const 포인터로 전달한다. 함수 안에서 배열의 크기가 필요할 때는 배열의 크기도 함께 전달한다. 함수 안에서는 일반 배열처럼 사용한다. 구조체의 전달 : 구조체를 복사하지 않고 전달하려면 포인터로 전달한다. 함수 안에서 변경되지 않는 구조체를 전달할 때는 const 포인터로 전달한다. 79 80 학습정리 재귀 함수 자기 자신을 호출하는 함수 기억부류

10 장. 함수의활용 수고하셨습니다. 질문있습니까? NEXT Chapter 11 장. 포인터의활용 81