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

Similar documents
<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

ch15

Microsoft PowerPoint - Chapter14_17.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - ch07 - 포인터 pm0415

11장 포인터

Microsoft PowerPoint - ch07 - 포인터 pm0415

untitled

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

Microsoft PowerPoint - 제11장 포인터

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

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

Microsoft PowerPoint - chap-11.pptx

슬라이드 1

8장. 포인터

Microsoft PowerPoint - Chapter_08.pptx

PowerPoint 프레젠테이션

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

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

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

PowerPoint 프레젠테이션

설계란 무엇인가?

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

Data Structure

11장 포인터

Microsoft PowerPoint - Lesson2.pptx

Microsoft PowerPoint - Chapter8.pptx

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

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

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

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

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

untitled

Microsoft PowerPoint - 09_C_Language_Pointer_Advanced

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

Microsoft PowerPoint - chap06-2pointer.ppt

untitled

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

Microsoft PowerPoint - chap12-고급기능.pptx

Infinity(∞) Strategy

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

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

11장 포인터

02장.배열과 클래스

제 15 장전처리및비트연산 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

PowerPoint Template

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

문서의 제목 나눔명조R, 40pt

Microsoft PowerPoint - chap-03.pptx

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

C 프로그래밊 개요

Microsoft PowerPoint - chap06-1Array.ppt

중간고사

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

설계란 무엇인가?

11장 포인터

PowerPoint 프레젠테이션

ABC 6장

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

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

KNK_C_05_Pointers_Arrays_structures_summary_v02

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap06.ppt

<4D F736F F F696E74202D20C1A633C0E52043C7C1B7CEB1D7B7A5B1B8BCBABFE4BCD2>

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

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

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

ABC 6장

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

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

Microsoft PowerPoint - 7장 배열 pptx

Microsoft PowerPoint - Lesson6.pptx

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - chap06-8.ppt

: 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

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

슬라이드 1

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - 제3장-배열.pptx

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

C++ Programming

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

PowerPoint 프레젠테이션

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

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

본 강의에 들어가기 전

BMP 파일 처리

C 프로그래밊 개요

歯9장.PDF

Microsoft PowerPoint - 제9강 문자열

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

슬라이드 1

Data Structure

chap7.key

OCW_C언어 기초

프로그램의실행화면 주석 (comment) 두수의합 : 300 /* 두개의숫자의합을계산하는프로그램 */ 주석은코드를설명하는글입니다. 주석 3 가지방법의주석 주석의예 /* 한줄로된주석 */ /* 저자 : 홍길동날짜 : 2013.

Transcription:

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

이번장에서학습할내용 이중포인터란무엇인가? 포인터배열 함수포인터 다차원배열과포인터 void 포인터 포인터는다양한용도로유용하게활용될수있습니다. 2

이중포인터 이중포인터 (double pointer): 포인터를가리키는포인터 int i = 100; int *p = &i; int **q = &p; // i 는 int 형변수 // p 는 i 를가리키는포인터 // q 는포인터 p 를가리키는이중포인터 3

이중포인터 // 이중포인터프로그램 #include <stdio.h> int main(void) int i = 100; int *p = &i; int **q = &p; *p = 200; printf("i=%d *p=%d **q=%d \n", i, *p, **q); **q = 300; printf("i=%d *p=%d **q=%d \n", i, *p, **q); return 0; i=200 *p=200 **q=200 i=300 *p=300 **q=300 4

예제 #2 // 이중포인터프로그램 #include <stdio.h> void set_proverb(char **q); int main(void) char *s = NULL; set_proverb(&s); printf("selected proverb = %s\n",s); return 0; void set_proverb(char **q) static char *str1="a friend in need is a friend indeed"; static char *str2="a little knowledge is a dangerous thing"; *q = str1; selected proverb = A friend in need is a friend indeed 5

포인터배열 포인터배열 (array of pointers): 포인터를모아서배열로만든것 int a = 10, b = 20, c = 30, d = 40, e = 50; int *pa[5] = &a, &b, &c, &d, &e ; 6

문자열배열 문자열배열 가장많이사용되는포인터배열 문자열들을효율적으로저장할수있다. char *fruits[ ] = "apple", "blueberry", "orange", melon" ; 7

문자열배열 vs 2 차원배열 문자열들을저장하는 2 차원배열 공간의낭비가발생할수있다. char fname[ ][10] = "apple", "blueberry", "orange", melon" ; 8

문자열상수의의미 문자열상수는문자열의시작번지를반환한다. 포인터배열의각원소들은이시작번지로초기화된다. 9

stringarray.c // 문자열배열 #include <stdio.h> int main(void) int i, n; char *fruits[ ] = "apple", "blueberry", "orange", "melon" ; n = sizeof(fruits)/sizeof(fruits[0]); // 배열원소개수계산 for(i = 0; i < n; i++) printf("%s \n", fruits[i]); return 0; apple blueberry orange melon 10

함수포인터 함수포인터 (function pointer): 함수를가리키는포인터 반환형 (* 함수포인터이름 )( 매개변수 1, 매개변수 2,...); 11

fp1.c // 함수포인터 #include <stdio.h> // 함수원형정의 int add(int, int); int sub(int, int); int main(void) int result; int (*pf)(int, int); // 함수포인터정의 pf = add; result = pf(10, 20); printf("10+20은 %d\n", result); pf = sub; result = pf(10, 20); printf("10-20은 %d\n", result); // 함수포인터에함수 add() 의주소대입 // 함수포인터를통한함수 add() 호출 // 함수포인터에함수 sub() 의주소대입 // 함수포인터를통한함수 sub() 호출 return 0; 12

fp1.c int add(int x, int y) return x+y; int sub(int x, int y) return x-y; 10+20 은 30 10-20 은 -10 13

함수포인터의배열 반환형 (* 배열이름 [ 배열의 _ 크기 ])( 매개변수목록 ); int (*pf[5]) (int, int); 14

fp2.c // 함수포인터배열 #include <stdio.h> // 함수원형정의 void menu(void); int add(int x, int y); int sub(int x, int y); int mul(int x, int y); int div(int x, int y); void menu(void) printf("=====================\n"); printf("0. 덧셈 \n"); printf("1. 뺄셈 \n"); printf("2. 곱셈 \n"); printf("3. 나눗셈 \n"); printf("4. 종료 \n"); printf("=====================\n"); 15

fp2.c int main(void) int choice, result, x, y; // 함수포인터배열을선언하고초기화한다. int (*pf[4])(int, int) = add, sub, mul, div ; 함수포인터배열선언 while(1) menu(); printf(" 메뉴를선택하시오 :"); scanf("%d", &choice); if( choice < 0 choice >=4 ) break; printf("2 개의정수를입력하시오 :"); scanf("%d %d", &x, &y); result = pf[choice](x, y); // 함수포인터를이용한함수호출 printf(" 연산결과 = %d\n",result); return 0; 16

fp2.c int add(int x, int y) return x + y; int sub(int x, int y) return x - y; int mul(int x, int y) return x * y; int div(int x, int y) return x / y; ===================== 0. 덧셈 1. 뺄셈 2. 곱셈 3. 나눗셈 4. 종료 ===================== 메뉴를선택하시오 :2 2 개의정수를입력하시오 :10 20 연산결과 = 200 ===================== 0. 덧셈 1. 뺄셈 2. 곱셈 3. 나눗셈 4. 종료 ===================== 메뉴를선택하시오 : 17

함수인수로서의함수포인터 함수포인터도인수로전달이가능하다. 18

fp2.c #include <stdio.h> #include <math.h> double f1(double k); double f2(double k); double formula(double (*pf)(double), int n); int main(void) printf("%f\n", formula(f1, 10)); printf("%f\n", formula(f2, 10)); double formula(double (*pf)(double), int n) int i; double sum = 0.0; for(i = 1; i < n; i++) sum += pf(i) * pf(i) + pf(i) + 1; return sum; 19

fp2.c double f1(double k) return 1.0 / k; double f2(double k) return cos(k); 13.368736 12.716152 20

다차원배열과포인터 2차원배열 int m[3][3] 1행->2행->3행->... 순으로메모리에저장 ( 행우선방법 ) 하나의열 m m[0][0] m[0][0] m[0] m[0][1] m[0][1] 1 행 하나의행 m[0][2] m[0][2] m[1][0] m[1][0] m[1] m[0][0] m[0][0] m[0][1] m[0][1] m[0][2] m[0][2] m[1][1] m[1][1] 2 행 m[1][0] m[1][0] m[1][1] m[1][1] m[1][2] m[1][2] m[1][2] m[1][2] 열 (column) 행m[2][0] m[2][0] (row) m[2][1] m[2][1] m[2][2] m[2][2] m[2][0] m[2][0] m[2] m[2][1] m[2][1] 3 행 m[2][2] m[2][2] 21

2 차원배열과포인터 배열이름 m은 &m[0][0] m[0] 는 1행의시작주소 m[1] 은 2행의시작주소 m m[0] m[0] m[0][0] m[0][0] m[0][1] m[0][1] m[0][2] m[0][2] m[1] m[1] m[1][0] m[1][0] m[1][1] m[1][1] m[1][2] m[1][2] m[2] m[2] m[2][0] m[2][0] m[2][1] m[2][1] m[2][2] m[2][2] 22

multi_array.c // 다차원배열과포인터 #include <stdio.h> int main(void) int m[3][3] = 10, 20, 30, 40, 50, 60, 70, 80, 90 ; printf("m = %p\n", m); printf("m[0] = %p\n", m[0]); printf("m[1] = %p\n", m[1]); printf("m[2] = %p\n", m[2]); printf("&m[0][0] = %p\n", &m[0][0]); printf("&m[1][0] = %p\n", &m[1][0]); printf("&m[2][0] = %p\n", &m[2][0]); return 0; m = 1245020 m[0] = 1245020 m[1] = 1245032 m[2] = 1245044 &m[0][0] = 1245020 &m[1][0] = 1245032 &m[2][0] = 1245044 23

2 차원배열과포인터연산 m에대한연산의의미 m은 &m[0][0] m[0] m[0][0] m[0][0] m m+1 은 m[1] m[0][1] m[0][1] 1 행 m+2 은 m[2] m[0][2] m[0][2] m[1] m+1 m[1][0] m[1][0] m[1][1] m[1][1] 2 행 m[1][2] m[1][2] m[2] m+2 m[2][0] m[2][0] m[2][1] m[2][1] 3 행 m[2][2] m[2][2] 24

#include <stdio.h> two_dim_array.c int main(void) int m[3][3] = 10, 20, 30, 40, 50, 60, 70, 80, 90 ; printf("m = %p\n", m); printf("m+1 = %p\n", m+1); printf("m+2 = %p\n", m+2); printf("m[0] = %p\n", m[0]); printf("m[1] = %p\n", m[1]); printf("m[2] = %p\n", m[2]); return 0; m = 1245020 m+1 = 1245032 m+2 = 1245044 m[0] = 1245020 m[1] = 1245032 m[2] = 1245044 25

포인터를이용한배열원소방문 행의평균을구하는경우 double get_row_avg(int m[][cols], int r) int *p, *endp; double sum = 0.0; 열 (column) m[0][0] m[0][0] 행(row) m[0][1] m[0][1 ] m[0][2] m[0][2] p = &m[r][0]; endp = &m[r][cols]; m[1][0] m[1 ][0] m[1][1] m[1 ][1 ] m[1][2] m[1][2] while( p < endp ) sum += *p++; m[2][0] m[2][0] m[2][1] m[2][1 ] m[2][2] m[2][2] sum /= COLS; m[3][0] m[3][0] m[3][1] m[3][1 ] m[3][2] m[3][2] return sum; p endp endp 26

포인터를이용한배열원소방문 전체원소의평균을구하는경우 double get_total_avg(int m[][cols]) int *p, *endp; double sum = 0.0; 열 (column) m[0][0] m[0][0] 행(row) m[0][1] m[0][1] m[0][2] m[0][2] p = &m[0][0]; endp = &m[rows-1][cols]; m[1 m[1 ][0] ][0] m[1][1] m[1][1] m[1][2] m[1][2] while( p < endp ) sum += *p++; m[2][0] m[2][0] m[2][1] m[2][1] m[2][2] m[2][2] sum /= ROWS * COLS; m[3][0] m[3][0] m[3][1 m[3][1 ] ] m[3][2] m[3][2] return sum; p endp endp 27

void 포인터 순수하게메모리의주소만가지고있는포인터 가리키는대상물은아직정해지지않음 ( 예 ) void *vp; 다음과같은연산은모두오류이다. *vp; // 오류 *(int *)vp; // void형포인터를 int형포인터로변환한다. vp++; // 오류 vp--; // 오류 28

vp.c #include <stdio.h> int main(void) int a[] = 10, 20, 30, 40, 50 ; void *vp; vp = a; // 가능 vp = &a[2]; *vp = 35; vp++; *(int *)vp = 35; // 가능 // 오류 // 오류 // 가능 return 0; 29

main() 함수의인수 지금까지의 main() 함수형태 int main(void).. 외부로부터입력을받는 main() 함수형태 int main(int argc, char *argv[]).. 30

인수전달방법 C: \cprogram> mycopy src dst m y c c o o p y \0 \0 argv[0] s s r r c c \0 \0 argv[1] d s s t t \0 \0 3 3 argv[2] argc argv 배열 31

main_arg.c #include <stdio.h> int main(int argc, char *argv[]) int i= 0; for(i = 0;i < argc; i++) printf(" 명령어라인에서 %d 번째문자열 = %s\n", i, argv[i]); return 0; Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. c:\cprogram\mainarg\debug>mainarg src dst 명령어라인에서 0 번째문자열 = mainarg 명령어라인에서 1 번째문자열 =src 명령어라인에서 2 번째문자열 =dst c:\cprogram\mainarg\debug> 32

비주얼 C++ 프로그램인수입력방법 여기에프로그램인수들을넣으면된다. 33

mile2km.c #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) double mile, km; if( argc!= 2 ) printf(" 사용방법 : mile2km 거리 \n"); return 1; mile = atof(argv[1]); km = 1.609 * mile; printf(" 입력된거리는 %f km 입니다. \n", km); return 0; Microsoft Windows XP [Version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. c:\cprogram\mainarg\debug>mainarg 10 입력된거리는 16.090000 km 입니다. c:\cprogram\mainarg\debug> 34

Q & A 35