24
20162학기 고급컴퓨터프로그래밍및실습 (36342-02) LAB #8 함수 포인터와 동적 메모리 할당 1

LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

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

LAB #8 함수 포인터와동적 메모리 할당

1

Page 2: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(복습1) 함수 포인터

다음 프로그램은 함수 포인터 fp 를 정의하고, 이를 사용하여 sum( )을 호

출하는 예제이다. 이 프로그램을 이해하시오.

2

fp는 함수 포인터이다. 이는 (int, int) 를 파라미터로 받고, int 를리턴하는 함수들을 가리킬 수 있다.

Page 3: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(복습2) 함수 포인터

함수 포인터 fp 를 사용하여 sum( ) 과 prod( ) 를 호출하는 예제. 실행시켜

보시오.

3

Page 4: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습1) 함수를 가리키는 함수 포인터

실수 2개를 입력으로 받아서, 덧셈을 한 후 그 결과값을 리턴하는 함수

dsum( )을 정의하시오. 뺄셈, 곱셈, 나눗셈에 대해서도 각각 ddiff( ),

dmult( ), ddiv( )를 정의하시오. main( ) 에서는 이들을 가리킬 수 있는 함수

포인터 fmighty를 정의하고, 이 포인터를 사용하여 정의된 함수들을 한 번

씩 호출해 보도록 하시오. 즉 main( ) 에는 다음 문장 4개가 포함되어야 한

다.

4

Page 5: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습2) 함수 포인터를 파라미터로 갖는 함수 (1/3)

다음 프로그램에는 실수 2개가 주어졌을 때, 최소값, 최대값, 합계, 평균을

구하는 함수 min( ), max( ), sum( ), avg( ) 가 포함되어 있다.

5

Page 6: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습2) 함수 포인터를 파라미터로 갖는 함수 (2/3)

6

Page 7: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습2) 함수 포인터를 파라미터로 갖는 함수 (3/3)

main( ) 에서는 min( ), max( ), sum( ), avg( ) 함수를 직접 호출하지 않고

compute( ) 함수를 통해 이들을 호출한다. compute( ) 함수는 함수명 또는

함수 포인터와 그 함수의 파라미터들을 전달받아, 전달받은 함수가 할 일을

대행해 준다.

예를 들어, compute( min, x, y) 는 min(x, y)를 계산해 주고, compute(max,

x, y)는 max(x, y)를 계산해 준다. 이러한 역할을 하는 compute( ) 함수를 완

성하여 이 프로그램에 추가해 보시오. (Lab8 – prog2 - 이걸 쓰세요.txt) 파

일을 복사하여 작업해 보시오.

7

Page 8: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(복습2) void * 예제

다음 프로그램을 실행시켜 보시오.

8

void 형 포인터로 받아서정수형 포인터로 변환하여사용

정수형 포인터를 보냄

Page 9: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(복습2) void * 예제

다음 프로그램을 실행시켜 보시오.

9

void 형 포인터로 받아서더블형 포인터로 변환하여사용

더블형 포인터를 보냄

Page 10: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습3) void * 형 파라미터

두 수를 더하여 출력하는 add( ) 함수를 정의하려고 한다. add( ) 함수는 정

수값을 더하기도 하고, 실수값을 더하기도 한다. add( )의 세번째 파라미터

가 1이면 정수 덧셈을 하고, 2이면 실수 덧셈을 하도록 add( ) 함수를 정의

해 보시오.

10

Page 11: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습4) 두 수의 비교 함수

파라미터로 전달되는 두 정수를 비교하여, 앞의 수가 작으면 음수를 반환하

고, 뒤의 수가 작으면 양수를 반환하고, 같으면 0을 반환하는

CompareInt( ) 함수를 작성하시오. 함수 파라미터는 void * 형으로 하시오.

11

이 함수를 정의하시오.

Page 12: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(복습4) qsort( )로 정수배열 정렬하기12

qsort( ) 를 사용하기 위해서는원소 비교 함수만 정의해 주면 된다.

다음 프로그램을 실행시켜 보시오.ACPL Lab11 - review4.txt

Page 13: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(복습4) qsort 로 정수배열 정렬하기13

두 수가 같으면 0, 앞의 수가 크면 양수, 뒤의 수가 크면 음수를 반환함

Page 14: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(복습5) qsort 로 내림차순 정렬하기14

qsort( ) 한테 크기에대해 반대의 결과를주면 된다.

Page 15: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습5) 더블형 배열의 오름차순 정렬

main( ) 이 다음과 같이 정의되어 있다고 하자. qsort( ) 가 배열 A[ ]를 오름

차순으로 정렬하도록 12~13쪽에 있는 (복습4)의 프로그램을 수정해 보시

오.

15

Page 16: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습6) 더블형 배열의 내림차순 정렬

(실습 5)의 프로그램을 수정하여, 이번에는 A[ ]가 내림차순으로 정렬되도

록 해 보시오.

16

Page 17: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습7) 문자 배열의 오름차순 정렬

main( ) 이 다음과 같이 정의되어 있다고 하자. qsort( ) 가 배열 A[ ]에 들어

있는 문자들을 오름차순으로 정렬하도록 (복습4)의 프로그램을 수정하시오.

17

Page 18: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(복습6) 동적메모리 정수배열

다음 프로그램을 이해해 보고

실행시켜 봅시다. 결과는?

18

p

Page 19: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습8) 동적메모리 실수 배열

(복습6)의 프로그램을 수정하여 10개의 더블형 숫자들을 저장할 수 있는 배

열 B[ ]를 동적으로 할당 받아보시오. 배열 B[ ]에 적당한 실수값을 저장하

고, 모두 출력해 보시오.

19

Page 20: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습9) 동적메모리 문자 배열

(복습6)의 프로그램을 수정하여 문자 20개를 저장할 수 있는

배열 Name[ ]를 동적으로 할당 받아보시오. 배열 Name[ ]에 자신의 이름을

저장하고, 그 이름을 출력해 보시오.

20

Page 21: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습10) 동적 메모리 구조체

프로그램이 다음과 같이 시작한다고 하자. point 형 구조체 하나를 저장할

수 있는 공간을 할당 받고, 이를 p 가 가리키도록 한다. p 가 가리키는 구조

체에 적당한 좌표를 저장한 후 그대로 출력해 보시오.

21

Page 22: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습11) 동적 2차원 배열 – 행단위 할당

정수 포인터 배열 p[5]를 선언하시오. 그리고 원소를 7개씩 갖는 1차원 배

열들을 동적으로 할당 받아 아래 그림과 같이 연결 시키시오. 그렇게 한 후,

이 2차원 배열의 모든 원소를 화면에 출력해 보시오.

22

p[0]p[1]p[2]p[3]p[4]

malloc( 정수 7개 )

malloc( 정수 7개 )

malloc( 정수 7개 )

malloc( 정수 7개 )

malloc( 정수 7개 )

Page 23: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습12) 동적 2차원 배열 –배열 전체 한꺼번에 할당

정수 포인터 배열 p[5]를 선언하시오. 그리고 원소를 35개 갖는 1차원 배열

을 동적으로 할당 받아 아래 그림과 같이 연결 시키시오. 그렇게 한 후, 이

2차원 배열의 모든 원소를 화면에 출력해 보시오.

23

p[0]p[1]p[2]p[3]p[4]

malloc( 정수 35개 )

Page 24: LAB #8 함수포인터와 동적메모리할당contents.kocw.net/KOCW/document/2016/ewha/kimmyeong/16-3.pdf · 차원배열 – 배열포인터사용 “7개의원소를갖는1차원배열”을가리킬수있는포인터p를선언하시오

(실습13) 동적 2차원 배열 –배열 포인터 사용

“7개의 원소를 갖는 1차원 배열”을 가리킬 수 있는 포인터 p를 선언하시오.

35개의 정수를 저장할 수 있는 배열을 (실습12)와 같이 malloc( )으로 할당

받은 후, p가 그 배열을 가리키도록 하시오. p를 5x7 2차원 배열의 이름 (또

는 포인터로 가정하고), p를 사용하여 그 배열에 값을 채운 후 모두 출력해

보시오.

24

p

malloc( 정수 35개 )

힌트: int (*p)[7];