65
20162학기 고급컴퓨터프로그래밍및실습 (36342-02) 11장 포인터의 활용 1

Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

2016년2학기 고급컴퓨터프로그래밍및실습 (36342-02)

제11장 포인터의 활용

1

Page 2: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

포인터 배열

배열에 대한 포인터

함수 포인터

동적 메모리 할당과 사용

포인터의 다양한 활용2

Page 3: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

포인터 배열

주소를 저장하는 배열

3

Page 4: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

포인터 배열의 선언4

주소를 저장하는 배열을 선언한다.

Page 5: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

포인터 배열의 초기화5

Page 6: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

포인터 배열을 사용하는 프로그램 예제6

포인터 배열의선언 및 초기화

포인터 배열의 사용

Page 7: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

포인터 배열의 사용

포인터 배열의 각 원소에 배열의 시작 주소를 저장할 수 있다.

7

Page 8: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열의 원소를 가리키는 포인터 배열8

포인터 배열의선언 및 초기화

포인터 배열의 사용

Page 9: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

구조체 포인터 배열9

구조체 배열은 메모리를 많이사용하므로 비효율적이다.

구조체 포인터 배열을 준비하고 구조체 변수가 필요할 때 메모리에 할당하고 그 주소만 저장한다.

Page 10: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

구조체 포인터 배열10

Page 11: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

구조체 포인터 배열 사용 예제 (1/2)11

구조체 포인터 배열의선언 및 초기화

Page 12: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

구조체 포인터 배열 사용 예제 (2/2)12

구조체 포인터배열의 사용

Page 13: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열 전체를 가리키는 포인터13

Page 14: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열에 대한 포인터의 사용

배열에 대한 포인터에는 배열 전체의 주소를 저장한다. 배열 전체의 주소를 구하려면 배열 이름 앞에 & 연산자로 지정한다.

& 연산자 없이 배열 이름만 사용하면 배열 첫째 원소의 주소를 의미한다.

배열에 대한 포인터에는 크기가 같은 배열 주소만 저장할 수 있다.

14

Page 15: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열에 대한 포인터의 사용15

Page 16: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열에 대한 포인터의 사용

p는 배열 전체의 주소이고, *p

는 p가 가리키는 배열이 된다.

*p는 배열 이름처럼 사용할

수 있으므로, p가 가리키는 배

열의 i번째 원소에 접근하려면

(*p)[i]를 사용한다.

*p는 p[0]이므로, (*p)[i]는

p[0][i]와 같다.

16

Page 17: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

*p와 p[0]

p가 포인터 변수일 때 *p와 p[0]은 항상 같다. *p *(p + 0) p[0]

int 변수는 크기가 1인 int 배열로 볼 수 있다.

p가 배열에 대한 포인터일 때 (*p)[i]는 p[0][i]와 항상 같다.

17

Page 18: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

(*p)[i]와 *p[i]

(*p)[i]와 *p[i]는 서로 의미가 다르므로 주의해야 한다.

(*p)[i]는 p가 가리키는 배열의 i번째 원소라는 의미

*p[i]는 p[i]가 가리키는 값이라는 의미

18

Page 19: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열에 대한 포인터의 사용 예19

배열에 대한 포인터의선언 및 초기화

배열에 대한 포인터로배열의 원소 접근

Page 20: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열에 대한 포인터와 2차원 배열

배열에 대한 포인터는 2차원 배열의 한 묶음을 가리키는데 쓰임

20

Page 21: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열에 대한 포인터와 2차원 배열

배열에 대한 포인터를 &arr[0]으로 초기화하는 대신, 간단하게 arr로 초기화할 수 있다.

배열에 대한 포인터 p로 2차원 배열의 원소에 접근하려면 p가 마치 2차원 배열명인 것처럼 2개의 인덱스를 사용하면 된다.

21

Page 22: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열에 대한 포인터와 2차원 배열

배열에 대한 포인터는 이차원 배열에 접근하기 위한 용도로 사용된다

22

Page 23: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

2차원 배열을 가리키는 배열에 대한 포인터

23

배열에 대한 포인터의선언 및 초기화

2차원 배열의선언 및 초기화

배열에 대한 포인터로2차원 배열의 원소 접근

Page 24: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열의 원소를 가리키는 포인터와배열에 대한 포인터

배열의 원소를 가리키는 포인터

배열 원소형에 대한 포인터로 선언

1차원 배열의 시작 주소로 초기화

배열에 대한 포인터

2차원 배열의 제2크기와 같게 배열의 크기를 지정해서 선언

2차원 배열의 시작 주소로 초기화

24

Page 25: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열의 원소를 가리키는 포인터와배열에 대한 포인터의 구분

배열에 대한 포인터를 증가시키면 2차원 배열의 제2크기만큼씩포인터의 주소가 증가된다.

25

Page 26: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열의 원소를 가리키는 포인터와 배열에대한 포인터 비교

26

배열의 원소를 가리키는포인터의 선언 및 초기화

배열에 대한 포인터의선언 및 초기화

int*는 4바이트씩증가하지만int(*)[3]는 12바이트씩 증가한다.

Page 27: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

배열의 원소를 가리키는 포인터 vs. 배열에대한 포인터

배열의 원소를 가리키는 포인터: 1차원 배열의 원소에 접근

배열에 대한 포인터 : 2차원 배열의 원소에 접근

27

Page 28: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

함수에 대한 포인터

함수의 주소를 저장하는 포인터

함수도 컴파일 및 링크 후에 메모리의 특정 번지에 할당된다.

실행 파일은 크게 코드 영역와 데이터 영역으로 나누어진다.

변수들은 데이터 영역에 할당되고, 함수들은 코드 영역에 할당된다.

28

Page 29: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

함수에 대한 포인터 변수의 선언

함수에 대한 포인터 변수가 가리킬 함수의 원형이 필요하다.

함수에 대한 포인터가 아직 가리키는 함수가 없으면 널 포인터로 초기화한다.

29

Page 30: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

함수의 주소 구하기

함수의 주소를 구할 때는 ( ) 없이 함수명 앞에 & 연산자를 써준다.

& 없이 함수명만 사용해도 된다.

30

Page 31: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

함수에 대한 포인터로 함수 호출

간접 참조 연산자를 이용해서 함수를 호출한다.

함수에 대한 포인터 변수가 함수명인 것처럼 사용할 수도 있다.

31

Page 32: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

함수에 대한 포인터 사용 예32

함수에 대한 포인터의선언 및 초기화

함수에 대한 포인터로함수 호출

Page 33: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

함수에 대한 포인터 사용 예33

Page 34: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

함수에 대한 포인터형의 정의34

Page 35: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

함수에 대한 포인터형의 사용

함수에 대한 포인터형도 typedef로 정의된 데이터형이다.

함수에 대한 포인터형으로 선언된 변수는 함수에 대한 포인터 변수가된다.

함수에 대한 포인터 변수를 직접 선언하는 것보다 함수에 대한포인터형을 정의하는 것이 사용하기 간편하다.

35

Page 36: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

표준 C 라이브러리의 qsort 함수(1/3)

함수명은 몰라도 함수의 주소만 있으면 함수를 호출할 수 있다.

36

Page 37: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

표준 C 라이브러리의 qsort 함수 (2/3)

qsort 함수에서 호출될 비교 함수를 정의하고, 그 주소를 qsort 함수의 마지막 인자로 전달한다.

비교 함수의 원형

e1, e2 : qsort 함수에 인자로 전달된 배열 원소를 가리키는 포인터 e1, e2는 모두 void*형 사용 전에 배열의 원소를 가리키는 포인터형으로 형 변환

리턴 값 > 0 : e1이 가리키는 원소가 더 크다.

리턴 값 < 0 : e2가 가리키는 원소가 더 크다. 리턴 값 == 0 : e1이 가리키는 원소와 e2가 가리키는 원소의 값이 같다.

기본적인 qsort 함수는 오름차순으로 정렬한다.

내림차순으로 정렬하려면 비교 함수의 리턴 값이 반대가 되도록 정의한다.

37

Page 38: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

표준 C 라이브러리의 qsort 함수 (3/3)

int 배열을 오름차순으로 정렬할 때 사용될 비교 함수

qsort 함수는 구조체 배열을 정렬할 때도 사용할 수 있다.

38

Page 39: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

콜백 함수 (1/2)

라이브러리에 의해서 호출되는 사용자 프로그램 내의 함수

qsort에 의해서 호출되는 비교 함수도 일종의 콜백 함수이다.

라이브러리로 함수의 주소를 넘겨주고, 라이브러리는 함수에

대한 포인터로 콜백 함수를 호출한다.

39

Page 40: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

콜백 함수 (2/2)40

Page 41: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

qsort 함수의 사용(1/2)41

qsort 함수 사용시 필요한 헤더

비교 함수의 선언

qsort 함수의 호출

Page 42: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

qsort 함수의 사용(2/2)42

int 배열정렬시 사용될비교 함수

Page 43: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

qsort 함수를 이용한 구조체 배열의 정렬(1/4)

43

Page 44: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

qsort 함수를 이용한 구조체 배열의 정렬(2/4)

44

이름 순 정렬

이름 순 정렬에사용될 비교 함수

평균 순 정렬

Page 45: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

qsort 함수를 이용한 구조체 배열의 정렬(3/4)

45

평균 순 정렬에사용될 비교 함수

Page 46: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

qsort 함수를 이용한 구조체 배열의 정렬(4/4)

46

Page 47: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

정적 메모리 vs. 동적 메모리47

Page 48: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리가 필요한 경우

배열의 크기를 미리 알 수 없을 때, 배열의 크기는 변수로 지정할 수 없다.

배열의 최대 크기를 가정해서 최대 크기만큼 배열을 할당할 수 있다.

동적 메모리를 사용하면 프로그래머가 원하는 만큼 메모리를 할당할 수 있으므로 메모리 낭비를 최소화할 수 있다.

동적 메모리를 사용하면 메모리의 할당과 해제시점을 프로그래머가 마음대로선택할 수 있다.

동적 메모리는 메모리 사용에 있어서 프로그래머에게 최대한의 자유를 보장한다.

48

Page 49: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리의 할당(1/2)

malloc 함수의 원형

size : 할당할 메모리의 바이트 크기 리턴 값 : 할당된 메모리의 주소(void*형) 특정 포인터형 변수에 저장

동적 메모리를 할당할 수 없으면 NULL 리턴

malloc 함수의 사용 예

49

Page 50: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리의 할당(2/2)50

Page 51: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리의 사용

동적 메모리의 주소를 저장하는 포인터 변수는 배열의 원소를 가리키는 포

인터처럼 사용한다.

51

Page 52: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리의 해제

free 함수의 원형

memblock : 해제될 메모리의 주소

free 함수: 인자로 넘겨준 포인터가 가리키는 동적 메모리를 해제한다.

동적 메모리를 해제한 다음에는 동적 메모리를 가리키던 포인터변수에 NULL을 대입하는 것이 안전하다.

52

Page 53: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리의 이용 예(1/2)53

메모리 관련 함수를사용하기 위해 필요한 헤더

동적 메모리의 주소를저장할 포인터 선언

동적 메모리의 할당

Page 54: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리의 이용 예(2/2)54

동적 메모리의 해제

동적 메모리의 사용

Page 55: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리의 사용 과정(1/2)

먼저 동적 메모리의 주소를 저장할 포인터 변수를 선언한다.

동적 메모리를 할당할 때는 malloc 함수를 사용한다. malloc 함수의 인자로는 할당할 메모리의 바이트 크기를 지정한다.

동적 메모리를 사용할 때는 배열의 원소를 가리키는 포인터처럼 사용한다. 즉, arr[i]처럼 인덱스를 이용한다.

55

포인터타입

Page 56: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리의 사용 과정(2/2)

동적 메모리는 사용이 끝나면 free 함수로 해제한다. 이때 더 이상 해제된

동적 메모리를 가리키지 않도록 포인터 변수를 NULL로 만든다.

56

Page 57: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리와 구조체 포인터 배열(1/3)

프로그램 실행 중에 구조체를 동적 메모리에 할당하고, 그 주소만 포인터 배열에 저장하고 사용할 수 있다.

직사각형에 대한 정보를 저장할 구조체 RECT의 정의

직사각형이 몇 개나 필요한지 미리 알 수 없으므로 구조체 포인터 배열선언

57

Page 58: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리와 구조체 포인터 배열(2/3)

RECT 구조체는 필요할 때마다 동적 메모리에 할당하고 그 주소만 포인터 배열의 원소로 저장한다.

arr[i]는 구조체 포인터이므로 구조체의 멤버에 접근할 때-> 연산자를 이용한다.

58

Page 59: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리와 구조체 포인터 배열(3/3)

구조체 포인터 배열을 사용하면 꼭 필요한 만큼만 구조체를 동적 메모리에 할당해서 사용할 수 있다.

사용이 끝난 후에 배열의 원소가 가리키는 동적 메모리를 해제해야 한다.

59

Page 60: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리에 할당된 구조체를 가리키는포인터 배열 (1/3)

60

구조체 포인터 배열의 선언

RECT 구조체의 정의

Page 61: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리에 할당된 구조체를 가리키는포인터 배열 (2/3)

61

구조체에 대한 동적 메모리 할당

구조체 포인터 배열의 사용

Page 62: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리에 할당된 구조체를 가리키는포인터 배열 (3/3)

62

동적 메모리의 해제

Page 63: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

동적 메모리 관련 함수63

Page 64: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

학습 정리 : 포인터의 활용

포인터 배열 : 주소를 저장하는 배열

int *arr[3];

배열에 대한 포인터: 배열 전체를 가리키는 포인터

int (*p)[3];

함수에 대한 포인터: 함수를 가리키는 포인터

int (*pf)(int);

함수에 대한 포인터 형: 함수를 가리키는 포인터 형

typedef int (*FUNCPTR)(int);

64

Page 65: Ch 0. 프로그래밍 언어elearning.kocw.net/KOCW/document/2016/ewha/kimmyeong/12.pdf · 배열에대한포인터와. 2. 차원배열. . 배열에대한포인터를&arr[0]으로초기화하는대신,

학습 정리 : 동적 메모리

동적 메모리의 필요성 : 실행 중에 필요한 메모리의 크기를 결정하거나, 함수가 리턴해도 해제되지 않은 메모리가 필요할 때 동적 메모리를 사용한다.

동적 메모리의 할당 : malloc 함수를 사용한다.

int *arr = (포인터 형 변환) malloc(sizeof(int) * size);

동적 메모리의 사용 : 동적 메모리를 가리키는 포인터를 배열 원소를 가리키는 포인터처럼 사용한다. 즉, 동적 메모리를 가리키는 포인터를 배열 이름인 것처럼 사용한다.

for(i = 0 ; i < size ; i++)

sum += arr[i];

동적 메모리의 해제 : free 함수를 사용한다.

free(arr);

65