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

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

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

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

슬라이드 1

Microsoft PowerPoint - chap12-고급기능.pptx

Microsoft PowerPoint - chap04-연산자.pptx

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

Microsoft PowerPoint - chap05-제어문.pptx

11장 포인터

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

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

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

untitled

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

Microsoft PowerPoint - ch07 - 포인터 pm0415

untitled

untitled

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

OCW_C언어 기초

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

PowerPoint 프레젠테이션

: 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



3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

Microsoft PowerPoint - Chapter_09.pptx

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

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

11장 포인터

PowerPoint 프레젠테이션

PowerPoint Presentation

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

untitled

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

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

PowerPoint Presentation

; struct point p[10] = {{1, 2, {5, -3, {-3, 5, {-6, -2, {2, 2, {-3, -3, {-9, 2, {7, 8, {-6, 4, {8, -5; for (i = 0; i < 10; i++){ if (p[i].x > 0 && p[i

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - chap06-2pointer.ppt

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

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

Microsoft PowerPoint - 제11장 포인터

02장.배열과 클래스

ch15

ABC 6장

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

Microsoft PowerPoint - chap-11.pptx

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

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

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

Microsoft PowerPoint - Chapter14_17.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

PowerPoint 프레젠테이션

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

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Microsoft PowerPoint - Chapter_08.pptx

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

설계란 무엇인가?

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

03장.스택.key

본 강의에 들어가기 전

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 \

歯9장.PDF

Infinity(∞) Strategy

chap8.PDF

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

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

OCW_C언어 기초

기초컴퓨터프로그래밍

8장. 포인터

Microsoft PowerPoint - [2009] 02.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

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

PowerPoint 프레젠테이션

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

Chapter_06

Microsoft PowerPoint - chap06-1Array.ppt

Data Structure

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

설계란 무엇인가?

Lab 3. 실습문제 (Single linked list)_해답.hwp

C 언어와 프로그래밍 개요

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

Microsoft PowerPoint - 제3장-배열.pptx

Microsoft PowerPoint - ch07 - 포인터 pm0415

컴파일러

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

PowerPoint Template

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

OCW_C언어 기초

C 프로그래밊 개요

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

14 주차구조체와공용체

Microsoft PowerPoint - Chapter8.pptx

Frama-C/JESSIS 사용법 소개

슬라이드 1

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 학습목표 포인터를 사용하는 다양한 방법에 대하여 알아본다. 포인터 배열을 선언하고 사용하는 방법을 알아본다. 를 선언하고 사용하는 방법을 알아본다. 를 선언하고 사용하는 방법을 알아본다. 가 무엇인지 알아보고, 를 할당하고 사용한 다음 해제하는 방법을 알아본다. 2

목차 포인터 배열 포인터 배열의 기본 구조체 포인터 배열 와 이차원 배열 배열 원소를 가리키는 포인터와 변수 형 의 활용 동적 동적 동적 동적 메모리의 필요성 메모리의 할당 및 해제 메모리의 활용 메모리 관련 함수 3 4 포인터의 활용 포인터 배열의 기본 포인터 배열의 선언 주소를 저장하는 배열

포인터의 활용 포인터 배열의 기본 포인터 배열의 사용(1/4) 포인터 배열의 각 원소로 변수의 주소를 저 장한다. 배열의 각 원소가 포인터형이므로, 원소가 가리키는 변수에 접근하려면 배열의 원소 앞에 간접 참조 연산자 *를 사용해야 한다. 5 6 포인터의 활용 포인터 배열의 기본 포인터 배열의 사용(2/4)

포인터의 활용 포인터 배열의 기본 int 변수를 가리키는 포인터 배열의 사용 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: /* Ex11_01.c */ #include <stdio.h> int main(void) int a=10, b=20, c=30, d=40, e=50; int* arr[5] = &a, &b, &c, &d, &e; int i; for( i = 0 ; i < 5 ; i++ ) printf("%d ", *arr[i]); printf("\n"); 포인터 배열의 선언 및 초기화 포인터 배열의 사용 return 0; 7 포인터의 활용 포인터 배열의 기본 포인터 배열의 사용(3/4) 포인터 배열의 각 원소에 배열의 시작 주소를 저장할 수도 있다. arr[i]가 int 배열의 시작 주소로 초기화되었을 때, arr[i]가 가리키는 배열의 원소에 접근하려면 arr[i][j]라고 쓰면 된다. 8

포인터의 활용 포인터 배열의 기본 포인터 배열의 사용(4/4) 배열의 시작 주소로 초기화된 포인터 배열 9 포인터의 활용 포인터 배열의 기본 int 배열의 원소를 가리키는 포인터 배열의 사용 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* Ex11_02.c */ #include <stdio.h> int main(void) int x[3] = 1, 2, 3; int y[3] = 4, 5, 6; int z[3] = 7, 8, 9; int* arr[3] = x, y, z; int i, j; for( i = 0 ; i < 3 ; i++ ) for( j = 0 ; j < 3 ; j++) printf("%d ", arr[i][j]); printf("\n"); 포인터 배열의 선언 및 초기화 포인터 배열의 사용 return 0; 10

포인터의 활용 구조체 포인터 배열 구조체 포인터 배열의 필요성 구조체 배열은 메모리 를 많이 사용하므로 비 효율적이다. 구조체 포인터 배열을 이용하면 구조체는 에 할당하고 그 주소만 포 인터 배열에 넣어두고 사용할 수 있다. 구조체 포인터 배열을 준비하고 구조체 변수 를 필요할 때 메모리에 할당하고 그 주소만 저 장한다. 11 포인터의 활용 구조체 포인터 배열 구조체 포인터 배열의 메모리 구조 12

포인터의 활용 구조체 포인터 배열 구조체 포인터 배열의 사용 예(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: /* Ex11_03.c */ #include <stdio.h> typedef struct student char name[20]; int korean, english, math; double average; STUDENT; int main(void) STUDENT s1 = "김모모", 100, 100, 100, 0.0; STUDENT s2 = "박나나", 90, 80, 88, 0.0; STUDENT s3 = "이만수", 45, 32, 44, 0.0; STUDENT* std[ ] = &s1, &s2, &s3; 구조체 포인터 배열의 선언 및 초기화 13 포인터의 활용 구조체 포인터 배열 구조체 포인터 배열의 사용 예(2/2) 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: int num = sizeof(std) / sizeof(std[0]); int i; for( i = 0 ; i < num ; i++ ) std[i]->average = (double)(std[i]->korean+ std[i]->english+std[i]->math) / 3; for( i = 0 ; i < num ; i++ ) printf("%s %6.2f\n", std[i]->name, std[i]->average); 구조체 포인터 배열의 사용 return 0; 14

의 선언 배열 전체를 가리키는 포인터 15 의 사용(1/4) 에는 배열 전체의 주소를 저장한다. 배열 전체의 주소를 구하려면 배열 이름 앞에 & 연산자를 지정해야 한다 & 연산자 없이 배열의 이름만 사용하면 배열의 첫 번째 원소(arr[0])의 주소를 의미한다. 에는 크기가 같은 배열의 주소만 저장할 수 있다. 16

의 사용(2/4) 17 의 사용(3/4) p는 배열 전체의 주소이고, *p는 p가 가리키는 배열이 된다. *p는 배열 이름처럼 사용할 수 있으므로, p가 가리키는 배열의 i번째 원소에 접근 하려면 (*p)[i]를 사용한다. *p는 p[0]이므로, (*p)[i]는 p[0][i]와 같다. 18

*p와 p[0] p가 포인터 변수일 때 *p와 p[0]은 항상 같다. *p Î *(p + 0) Î p[0] int 변수는 크기가 1인 int 배열로 볼 수 있다. p가 일 때 (*p)[i]는 p[0][i]와 항상 같다. 19 의 사용(4/4) (*p)[i]와 *p[i]는 서로 의미가 다르므로 주의해야 한다. (*p)[i]는 p가 가리키는 배열의 i번째 원소라는 의미 *p[i]는 p[i]가 가리키는 값이라는 의미 20

의 사용 예 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: /* Ex11_04.c */ #include <stdio.h> int main(void) int arr[5] = 10, 20, 30, 40, 50; int (*p)[5] = &arr; int i; 의 선언 및 초기화 for( i = 0 ; i < 5 ; i++ ) printf("%d ", (*p)[i]); // p[0][i] 또는 *((*p)+i) printf("\n"); 로 배열의 원소 접근 return 0; 21 와 이차원 배열 와 이차원 배열(1/3) 는 이차원 배열의 한 묶음을 가리키는 용도로 사용된다. 22

와 이차원 배열 와 이차원 배열(2/3) 를 &arr[0]으로 초기화하는 대신, 간단하게 arr로 초기화할 수 있다. p로 이차원 배열의 원소에 접근하려면 p가 마치 이차원 배열 명인 것처럼 2개의 인덱스를 사용하면 된다. 23 와 이차원 배열 와 이차원 배열(3/3) 는 이차원 배열에 접근하기 위한 용도로 사용된다. 24

와 이차원 배열 이차원 배열을 가리키는 (1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: /* Ex11_05.c */ #include <stdio.h> int main(void) int arr[3][5] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ; 이차원 배열의 선언 및 초기화 int (*p)[5] = arr; 의 선언 및 초기화 int i, j; 25 와 이차원 배열 이차원 배열을 가리키는 (2/2) 16: 17: 18: 19: 20: 21: 22: 23: 24: for( i = 0 ; i < 3 ; i++) for( j = 0 ; j < 5 ; j++ ) printf("%2d ", p[i][j]); printf("\n"); 로 이차원 배열의 원소 접근 return 0; 26

배열의 원소를 가리키는 포인터와 배열의 원소를 가리키는 포인터 배열 원소형에 대한 포인터로 선언 일차원 배열의 시작 주소로 초기화 이차원 배열의 제2크기와 같게 배열의 크기를 지정해서 선언 이차원 배열의 시작 주소로 초기화 27 배열의 원소를 가리키는 포인터와 배열의 원소를 가리키는 포인터와 의 구분 를 증가시키면 이차원 배열의 제2크기만큼씩 포인터의 주소가 증가된다. 28

배열의 원소를 가리키는 포인터와 배열의 원소를 가리키는 포인터와 비교 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* Ex11_06.c */ #include <stdio. int main(void) int x[5]; int *p1 = x; 배열의 원소를 가리키는 포인터의 선언 및 초기화 int y[2][3]; int (*p2)[3] = y; 의 선언 및 초기화 printf("p1 = %p, p2 = %p\n", p1, p2); int*는 4바이트씩 증가 하지만 int(*)[3]는 12 바이트씩 증가한다. p1++; p2++; printf("p1 = %p, p2 = %p\n", p1, p2); return 0; 29 배열의 원소를 가리키는 포인터와 배열의 원소를 가리키는 포인터 vs. 배열의 원소를 가리키는 포인터는 일차원 배열의 원소에 접근할 때 사용되고, 배 열에 대한 포인터는 이차원 배열의 원소에 접근할 때 사용된다. 30

함수의 주소를 저장하는 포인터 함수도 컴파일 및 링크 후에 메모리의 특정 번지에 할당된다. 실행 파일은 크게 코드 영역와 데이터 영역으로 나누어진다. 변수들은 데이터 영역에 할당되고, 함수들은 코드 영역에 할당된다. 31 변수 변수의 선언 변수가 가리킬 함수의 원형이 필요하다. 가 아직 가리키는 함수가 없으면 널 포인터로 초기화한다. 32

변수 함수의 주소 구하기 함수의 주소를 구할 때는 ( ) 없이 함수명 앞에 & 연산자를 써준다. & 없이 함수명만 사용해도 된다. 33 변수 로 함수 호출 간접 참조 연산자를 이용해서 함수를 호출한다. 변수가 함수명인 것처럼 사용할 수도 있다. 34

변수 사용 예(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: /* Ex11_07.c */ #include <stdio.h> int GetFactorial(int n); double Add(double x, double y); int main(void) int (*pfunc)(int n) = &GetFactorial; double (*pf)(double, double) = Add; int num; printf("정수를 입력하세요 : "); scanf("%d", &num); printf("%d! = %d\n", num, (*pfunc)(num)); printf("0.5 + 1.3 = %f\n", pf(0.5, 1.3)); 의 선언 및 초기화 로 함수 호출 return 0; 35 변수 사용 예(2/2) 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: int GetFactorial(int n) int fact; int i; for( i = 1, fact = 1 ; i <= n ; i++ ) fact *= i; return fact; double Add(double x, double y) return x + y; 36

형 형의 정의 37 형 형의 사용 형도 typedef로 정의된 데이터형이다. 형으로 선언된 변수는 변수가 된다. 변수를 직접 선언하는 것보다 형을 정의하 는 것이 사용하기 간편하다. 38

의 활용 퀵 정렬(1/2) 정렬할 배열 중에서 키(key)을 선택한다. 정렬할 배열의 원소들을 키보다 작은 값과 키보다 큰 값의 두 그룹으로 나눈다. 두 그룹에 대해서 각각 다시 퀵 정렬을 수행한다. 그룹 내에 값이 하나만 남을 때까지 계속 이 작업을 반복한다. 39 40 의 활용 퀵 정렬(2/2)

의 활용 표준 C 라이브러리의 qsort 함수(1/3) 함수명은 몰라도 함수의 주소만 있으면 함수를 호출할 수 있다. 41 의 활용 표준 C 라이브러리의 qsort 함수(2/3) qsort 함수에서 호출될 비교 함수를 정의하고, 그 주소를 qsort 함수의 마지막 인 자로 전달한다. 비교 함수의 원형 e1, e2 : qsort 함수에 인자로 전달된 배열 원소를 가리키는 포인터 e1, e2는 모두 void*형 사용 전에 배열의 원소를 가리키는 포인터형으로 형 변환 리턴 값 > 0 : e1이 가리키는 원소가 더 크다. 리턴 값 < 0 : e2가 가리키는 원소가 더 크다. 리턴 값 == 0 : e1이 가리키는 원소와 e2가 가리키는 원소의 값이 같다. 기본적인 qsort 함수는 오름차순으로 정렬한다. 내림차순으로 정렬하려면 비교 함수의 리턴 값이 반대가 되도록 정의한다. 42

의 활용 표준 C 라이브러리의 qsort 함수(3/3) int 배열을 오름차순으로 정렬할 때 사용될 비교 함수 qsort 함수는 구조체 배열을 정렬할 때도 사용할 수 있다. 43 44 의 활용 콜백 함수 라이브러리에 의해서 호 출되는 사용자 프로그램 내의 함수 qsort에 의해서 호출되는 비교 함수도 일종의 콜백 함수이다. 라이브러리로 함수의 주 소를 넘겨주고, 라이브러 리는 로 콜백 함수를 호출한다.

의 활용 qsort 함수의 사용(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: /* Ex11_08.c */ #include <stdio.h> #include <stdlib.h> qsort 함수 사용시 필요한 헤더 int Compare(const void *e1, const void *e2); void PrintArray(const int* arr, int size); 비교 함수의 선언 int main( ) int x[10] = 34, 50, 5, 17, 82, 66, 73, 1, 48, 29; printf("정렬 전 : "); PrintArray(x, 10); qsort(x, 10, sizeof(int), Compare); qsort 함수의 호출 printf("정렬 후 : "); PrintArray(x, 10); return 0; 45 의 활용 qsort 함수의 사용(2/2) 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: int Compare(const void *e1, const void *e2) int *p1 = (int*) e1; int *p2 = (int*) e2; return (*p1 - *p2); // 오름차순 정렬 //return -(*p1 - *p2); // 내림차순 정렬 int 배열 정렬시 사용될 비교 함수 void PrintArray(const int* arr, int size) int i; for( i = 0 ; i < size ; i++ ) printf("%d ", arr[i]); printf("\n"); 46

의 활용 qsort 함수를 이용한 구조체 배열의 정렬(1/4) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: /* Ex11_09.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct student char name[20]; double ave; STUDENT; int CompareByName(const void *e1, const void *e2); int CompareByAve(const void *e1, const void *e2); void PrintStudent(const STUDENT* std, int num); int main( ) STUDENT std[5] = "이모모", 58.5, "박모모", 73.9, "김모모", 87.2, "최모모", 96.6, "나모모", 34.3, ; 47 의 활용 qsort 함수를 이용한 구조체 배열의 정렬(2/4) 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: printf("*** 정렬 전 ***\n"); PrintStudent(std, 5); qsort(std, 5, sizeof(student), CompareByName); 이름 순 정렬 printf("*** 이름 순 정렬 ***\n"); PrintStudent(std, 5); qsort(std, 5, sizeof(student), CompareByAve); 평균 순 정렬 printf("*** 평균 순 정렬 ***\n"); PrintStudent(std, 5); return 0; int CompareByName(const void *e1, const void *e2) STUDENT *p1 = (STUDENT *) e1; STUDENT *p2 = (STUDENT *) e2; return strcmp(p1->name, p2->name); 이름 순 정렬에 사용될 비교 함수 48

의 활용 qsort 함수를 이용한 구조체 배열의 정렬(3/4) 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: int CompareByAve(const void *e1, const void *e2) STUDENT *p1 = (STUDENT *) e1; STUDENT *p2 = (STUDENT *) e2; double temp = p1->ave - p2->ave; if( temp == 0 ) return 0; if( temp > 0 ) return 1; return -1; 평균 순 정렬에 사용될 비교 함수 void PrintStudent(const STUDENT* std, int num) int i; for( i = 0 ; i < 5 ; i++ ) printf("%-10s %5.1f\n", std[i].name, std[i].ave); printf("\n"); 49 의 활용 qsort 함수를 이용한 구조체 배열의 정렬(4/4) 50

정적 메모리 vs. 51 의 필요성 가 필요한 경우 배열의 크기를 미리 알 수 없을 때, 배열의 크기는 변수로 지정할 수 없다. 배열의 크기는 상수 로만 지정할 수 있다. 배열의 최대 크기를 가정해서 최대 크기만큼 배열을 할당할 수 있다. 메모리 낭비 발생 를 메모리 낭비를 를 택할 수 있다. 는 사용하면 프로그래머가 원하는 만큼 메모리를 할당할 수 있으므로 최소화할 수 있다. 사용하면 메모리의 할당과 해제시점을 프로그래머가 마음대로 선 메모리 사용에 있어서 프로그래머에게 최대한의 자유를 보장한다. 52

의 할당 및 해제 의 할당(1/2) malloc 함수의 원형 size : 할당할 메모리의 바이트 크기 리턴 값 : 할당된 메모리의 주소(void*형) Î 특정 포인터형 변수에 저장 를 할당할 수 없으면 NULL 리턴 malloc 함수의 사용 예 53 의 할당 및 해제 의 할당(2/2) 54

의 할당 및 해제 의 사용 의 주소를 저장하는 포인터 변수는 배열의 원소를 가리키는 포인터처 럼 사용한다. 55 의 할당 및 해제 의 해제 free 함수의 원형 memblock : 해제될 메모리의 주소 free 함수는 인자로 넘겨준 포인터가 가리키는 를 해제한다. 를 해제한 다음에는 를 가리키던 포인터 변수에 NULL을 대입하는 것이 안전하다. 56

의 할당 및 해제 의 이용 예(1/2) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: /* Ex11_10.c */ #include <stdio.h> #include <stdlib.h> 메모리 관련 함수를 사용하기 위해 필요한 헤더 int main( ) int size; int *arr = NULL; int sum = 0; double average = 0.0; int i; 의 주소를 저장할 포인터 선언 printf("몇 개의 정수를 입력하시겠습니까? : "); scanf("%d", &size); arr = malloc(sizeof(int)*size); if( arr == NULL ) printf(" 할당 실패\n"); return -1; 의 할당 57 의 할당 및 해제 의 이용 예(2/2) 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: printf("%d개의 정수를 입력하세요 : ", size); for( i = 0 ; i < size ; i++ ) scanf("%d", &arr[i]); 의 사용 for( i = 0 ; i < size ; i++ ) sum += arr[i]; average = (double)sum / (double)size; printf("합계 : %d, 평균 : %f\n", sum, average); free(arr); arr = NULL; 의 해제 return 0; 58

의 할당 및 해제 의 사용 과정(1/2) 먼저 의 주소를 저장할 포인터 변수를 선언한다. 를 할당할 때는 malloc 함수를 사용한다. malloc 함수의 인자로는 할 당할 메모리의 바이트 크기를 지정한다. 를 사용할 때는 배열의 원소를 가리키는 포인터처럼 사용한다. 즉, arr[i]처럼 인덱스를 이용한다. 59 의 할당 및 해제 의 사용 과정(2/2) 는 사용이 끝나면 free 함수로 해제한다. 이때 더 이상 해제된 동적 메 모리를 가리키지 않도록 포인터 변수를 NULL로 만든다. 60

의 활용 와 구조체 포인터 배열(1/3) 프로그램 실행 중에 구조체를 에 할당하고, 그 주소만 포인터 배열에 저장하고 사용할 수 있다. 직사각형에 대한 정보를 저장할 구조체 RECT의 정의 직사각형이 몇 개나 필요한지 미리 알 수 없으므로 구조체 포인터 배열 선언 61 의 활용 와 구조체 포인터 배열(2/3) RECT 구조체는 필요할 때마다 에 할당하고 그 주소만 포인터 배열의 원소로 저장한다. arr[i]는 구조체 포인터이므로 구조체의 멤버에 접근할 때 -> 연산자를 이용한다. 62

의 활용 와 구조체 포인터 배열(3/3) 구조체 포인터 배열을 사용하면 꼭 필요한 만큼만 구조체를 에 할당해 서 사용할 수 있다. 사용이 끝난 후에 배열의 원소가 가리키는 를 해제해야 한다. 63 의 활용 에 할당된 구조체를 가리키는 포인터 배열(1/3) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: /* Ex11_11.c */ #include <stdio.h> #include <stdlib.h> typedef struct rect int x, y; int width, height; RECT; int main(void) RECT *arr[100] = NULL; int count = 0; int i; RECT 구조체의 정의 구조체 포인터 배열의 선언 while(1) char choice; printf("직사각형을 만들겠습니까? (Y/N) : "); 64

의 활용 에 할당된 구조체를 가리키는 포인터 배열(2/3) 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: scanf("%c", &choice); fflush(stdin); if( toupper(choice) == 'N' ) break; arr[count] = malloc(sizeof(rect)); arr[count]->x = rand( )%400; arr[count]->y = rand( )%400; arr[count]->width = rand( )%100; arr[count]->height = rand( )%100; count++; 구조체에 대한 할당 printf("%d개의 직사각형이 만들어졌습니다.\n", count); 구조체 포인터 배열의 사용 for(i = 0 ; i < count ; i++) printf("%d번째 직사각형 : (%3d,%3d) w=%3d, h=%3d\n", i+1,arr[i]->x,arr[i]->y,arr[i]->width,arr[i]->height); 65 의 활용 에 할당된 구조체를 가리키는 포인터 배열(3/3) 39: 40: 41: 42: 43: 44: 45: 46: 47: for(i = 0 ; i < count ; i++) free(arr[i]); arr[i] = NULL; 의 해제 return 0; 66

관련 함수 관련 함수 67 학습정리 포인터의 활용 포인터 배열 : 주소를 저장하는 배열 int *arr[3]; : 배열 전체를 가리키는 포인터 int (*p)[3]; : 함수를 가리키는 포인터 int (*pf)(int); 형: 함수를 가리키는 포인터 형 typedef int (*FUNCPTR)(int); 68

학습정리 의 필요성 : 실행 중에 필요한 메모리의 크기를 결정하거나, 함수가 리턴해도 해제되지 않은 메모리가 필요할 때 를 사용한다. 의 할당 : malloc 함수를 사용한다. int *arr = malloc(sizeof(int) * size); 의 사용 : 를 가리키는 포인터를 배열 원소를 가리키는 포 인터처럼 사용한다. 즉, 를 가리키는 포인터를 배열 이름인 것처럼 사 용한다. for(i = 0 ; i < size ; i++) sum += arr[i]; 의 해제 : free 함수를 사용한다. free(arr); 69 수고하셨습니다. 질문 있습니까? NEXT Chapter 12장. 고급기능 70