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

Similar documents
untitled

Microsoft PowerPoint - chap-11.pptx

11장 포인터

Microsoft PowerPoint - 제11장 포인터

Microsoft PowerPoint - ch07 - 포인터 pm0415

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

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

Microsoft PowerPoint - ch07 - 포인터 pm0415

PowerPoint 프레젠테이션

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

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

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

Data Structure

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

설계란 무엇인가?

슬라이드 1

Microsoft PowerPoint - chap06-2pointer.ppt

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

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

11장 포인터

KNK_C_05_Pointers_Arrays_structures_summary_v02

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chapter_08.pptx

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

02장.배열과 클래스

OCW_C언어 기초

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

ch15

설계란 무엇인가?

untitled

Microsoft PowerPoint - C_9장 포인터 pptx

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

PowerPoint Template

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

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

PowerPoint Presentation

Microsoft PowerPoint - 05-chap03-ArrayAndPointer.ppt

PowerPoint 프레젠테이션

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

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

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

중간고사

untitled

chap 5: Trees

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

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

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

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

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - Chapter14_17.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Chapter8.pptx

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

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

Microsoft PowerPoint - chap04-연산자.pptx

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

Microsoft PowerPoint - Lesson2.pptx

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

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

쉽게 풀어쓴 C 프로그래밍

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

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

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

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

ABC 6장

Microsoft PowerPoint - 04_C_Language_Function

Microsoft PowerPoint - chap06-1Array.ppt

PowerPoint 프레젠테이션

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 \

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

8장. 포인터

PowerPoint 프레젠테이션

Microsoft PowerPoint - Lesson6.pptx

Chapter 4. LISTS

6.1 Addresses and Pointers Recall memory concepts from Ch2 ch6_testbasicpointer.c int x1=1, x2=7; double distance; int *p; int q=8; p = &q; name addre

Microsoft PowerPoint - Chapter_04.pptx

Data Structure

Microsoft PowerPoint - C++ 5 .pptx

PowerPoint Presentation

Microsoft PowerPoint - chap12-고급기능.pptx

Microsoft PowerPoint - chap-05.pptx

쉽게 풀어쓴 C 프로그래밍

Infinity(∞) Strategy

Microsoft PowerPoint - chap-06.pptx

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

원형연결리스트에대한설명중틀린것은 모든노드들이연결되어있다 마지막에삽입하기가간단한다 헤더노드를가질수있다 최종노드포인터가 NULL이다 리스트의 번째요소를가장빠르게찾을수있는구현방법은무엇인가 배열 단순연결리스트 원형연결리스트 이중연결리스트 단순연결리스트의노드포인터 가마지막노드를

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

Microsoft PowerPoint - 제3장-배열.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

중간고사 (자료 구조)

Microsoft PowerPoint - chap05-제어문.pptx

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

컴파일러

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

Microsoft Word - FunctionCall

Transcription:

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

이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습합니다. 2

포인터란? 포인터 (pointer): 주소를가지고있는변수 3

메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 4

변수와메모리 변수의크기에따라서차지하는메모리공간이달라진다. char형변수 : 1바이트, int형변수 : 4바이트, int i = 10; char c = 69; float f = 12.3; 5

변수의주소 변수의주소를계산하는연산자 : & 변수 i의주소 : &i 6

변수의주소 int i= 10; char c = 69; float f = 12.3; printf("i의주소 : %u\n", &i); // 변수 i의주소출력 printf("c의주소 : %u\n", &c); // 변수 c의주소출력 printf("f의주소 : %u\n", &f); // 변수 f의주소출력 return 0; i 의주소 : 1245024 c 의주소 : 1245015 f 의주소 : 1245000 7

포인터의선언 포인터 : 변수의주소를가지고있는변수 int i = 10; int *p = &i; // 정수형변수 i 선언 // 변수 i 의주소가포인터 p 로대입 8

다양한포인터의선언 char c = 'A'; float f = 36.5; double d = 3.141592; // 문자형변수 c // 실수형변수 f // 실수형변수 d char *pc = &c; float *pf = &f; double *pd = &d; // 문자를가리키는포인터 pc // 실수를가리키는포인터 pf // 실수를가리키는포인터 pd 9

간접참조연산자 간접참조연산자 * : 포인터가가리키는값을가져오는연산자 int i = 10; int *p = &i; printf("%d\n", *p); // 10 이출력된다. *p = 20; printf("%d\n", *p); // 20이출력된다. 10

간접참조연산자의해석 간접참조연산자 : 지정된위치에서포인터의타입에따라값을읽어들인다. int *p = 8; // 위치 8에서정수를읽는다. char *pc = 8; // 위치 8에서문자를읽는다. double *pd = 8; // 위치 8에서실수를읽는다. 11

포인터예제 #1 #include <stdio.h> int i = 3000; int *p = &i; // 변수와포인터연결 printf("&i = %u\n", &i); printf("p = %u\n", p); // 변수의주소출력 // 포인터의값출력 printf("i = %d\n", i); printf("*p = %d\n", *p); // 변수의값출력 // 포인터를통한간접참조값출력 return 0; &i = 1245024 p = 1245024 i = 3000 *p = 3000 12

포인터예제 #2 #include <stdio.h> char c = 'A'; int i = 10000; double d = 6.78; char *pc = &c; int *pi = &i; double *pd = &d; // 문자형변수정의 // 정수형변수정의 // 실수형변수정의 // 문자형포인터정의및초기화 // 정수형포인터정의및초기화 // 실수형포인터정의및초기화 *pc++ 라고하면안됨 (*pc)++; *pi = *pi + 1; *pd += 1; // 간접참조로 1 증가 // 간접참조로 1 증가 // 간접참조로 1 증가 printf("c = %c\n", c); printf("i = %d\n", i); printf("d = %f\n", d); c=b i = 10001 d = 7.780000 return 0; 13

포인터예제 #3 #include <stdio.h> int i = 10000; int *p, *q; // 정수변수정의 // 정수형포인터정의 p = &i; q = &i; // 포인터 p 와변수 i 를연결 // 포인터 q 와변수 i 를연결 *p = *p + 1; // 포인터 p를통하여 1 증가 *q = *q + 1; // 포인터 q를통하여 1 증가 printf("i = %d\n", i); return 0; i = 10002 14

포인터사용시주의점 #1 포인터의타입과변수의타입은일치하여야한다. #include <stdio.h> int i; double *pd; pd = &i; *pd = 36.5; // 오류! double 형포인터에 int 형변수의주소를대입 return 0; 15

포인터사용시주의점 #2 초기화가안된포인터를사용하면안된다. int *p; // 포인터 p 는초기화가안되어있음 *p = 100; // 위험한코드 return 0; 16

포인터사용시주의점 #3 포인터가아무것도가리키고있지않는경우에는 NULL로초기화 NULL 포인터를가지고간접참조하면하드웨어로감지할수있다. 포인터의유효성여부판단이쉽다. 17

포인터연산 가능한연산 : 증가, 감소, 덧셈, 뺄셈연산 증가연산의경우증가되는값은포인터가가리키는객체의크기 포인터타입 ++ 연산후증가되는값 char 1 short 2 int 4 포인터의증가는일반변수와는약간다릅니다. 가리키는객체의크기만큼증가합니다. float 4 double 8 18

증가연산예제 // 포인터의증감연산 #include <stdio.h> char *pc; int *pi; double *pd; pc = (char *)10000; pi = (int *)10000; pd = (double *)10000; printf(" 증가전 pc = %d, pi = %d, pd = %d\n", pc, pi, pd); pc++; pi++; pd++; printf(" 증가후 pc = %d, pi = %d, pd = %d\n", pc, pi, pd); return 0; 증가전 pc = 10000, pi = 10000, pd = 10000 증가후 pc = 10001, pi = 10004, pd = 10008 19

포인터의증감연산 20

포인터간의비교 #include <stdio.h> int i, j, *p1, *p2; p1 = &i; p2 = &j; if( p1!= NULL ) printf("p1이 NULL이아님 \n"); 포인터와다른포인터비교가능 if( p1!= p2 ) printf("p1과 p2가같지않음 \n"); if( p1 < p2 ) printf("p1이 p2보다앞에있음 \n"); else printf("p1이 p2보다앞에있음 \n"); return 0; p1 이 NULL 이아님 p1 과 p2 가같지않음 p1 이 p2 보다앞에있음 21

간접참조연산자와증감연산자 수식 의미 v = *p++ p가가리키는값을 v에대입한후에 p를증가한다. v = (*p)++ p가가리키는값을 v에대입한후에가리키는값을증가한다. v = *++p p를증가시킨후에 p가가리키는값을 v에대입한다. v = ++*p p가가리키는값을가져온후에그값을증가하여 v에대입한다. // 포인터의증감연산 #include <stdio.h> int i = 10; int *pi = &i; i = 10, pi = 0012FF60 i = 11, pi = 0012FF60 i = 11, pi = 0012FF60 i = 11, pi = 0012FF64 printf("i = %d, pi = %p\n", i, pi); (*pi)++; printf("i = %d, pi = %p\n", i, pi); printf("i = %d, pi = %p\n", i, pi); *pi++; printf("i = %d, pi = %p\n", i, pi); return 0; 22

포인터와배열 // 포인터와배열의관계 #include <stdio.h> int a[] = 10, 20, 30, 40, 50 ; printf("&a[0] = %u\n", &a[0]); printf("&a[1] = %u\n", &a[1]); printf("&a[2] = %u\n", &a[2]); printf("a = %u\n", a); return 0; &a[0] = 1245008 &a[1] = 1245012 &a[2] = 1245016 a = 1245008 23

포인터와배열 // 포인터와배열의관계 #include <stdio.h> int a[] = 10, 20, 30, 40, 50 ; printf("a = %u\n", a); printf("a + 1 = %u\n", a + 1); printf("*a = %d\n", *a); printf("*(a+1) = %d\n", *(a+1)); return 0; a = 1245008 a + 1 = 1245012 *a = 10 *(a+1) = 20 24

// 포인터를배열이름처럼사용 #include <stdio.h> 포인터를배열처럼사용 int a[] = 10, 20, 30, 40, 50 ; int *p; p = a; printf("a[0]=%d a[1]=%d a[2]=%d \n", a[0], a[1], a[2]); printf("p[0]=%d p[1]=%d p[2]=%d \n\n", p[0], p[1], p[2]); p[0] = 60; p[1] = 70; p[2] = 80; printf("a[0]=%d a[1]=%d a[2]=%d \n", a[0], a[1], a[2]); printf("p[0]=%d p[1]=%d p[2]=%d \n", p[0], p[1], p[2]); return 0; a[0]=10 a[1]=20 a[2]=30 p[0]=10 p[1]=20 p[2]=30 a[0]=60 a[1]=70 a[2]=80 p[0]=60 p[1]=70 p[2]=80 25

포인터를사용한방법의장점 인덱스표기법보다빠르다. 원소의주소를계산할필요가없다. int get_sum1(int a[], int n) int i; int sum = 0; for(i = 0; i < n; i++ ) sum += a[i]; return sum; 인덱스표기법사용 int get_sum2(int a[], int n) int i; int *p; int sum = 0; p = a; for(i = 0; i < n; i++ ) sum += *p++; return sum; 포인터사용 26

배열의원소를역순으로출력 #include <stdio.h> void print_reverse(int a[], int n); int a[] = 10, 20, 30, 40, 50 ; print_reverse(a, 5); return 0; void print_reverse(int a[], int n) int *p = a + n - 1; // 마지막노드를가리킨다. while(p >= a) printf("%d\n", *p--); // 첫번째노드까지반복 // p가가리키는위치를출력하고감소 50 40 30 20 10 27

포인터와함수 C에서의인수전달방법 값에의한호출 : 기본적인방법 참조에의한호출 : 포인터이용 값에의한호출은값만을복사해요. 100 int i = 100; 100 i int sub( int v ) 100 v... sub( i );...... 28

참조에의한호출 함수호출시, 포인터를함수의매개변수로전달하는방법 #include <stdio.h> void sub(int *p); int i = 100; sub(&i); return 0; void sub(int *p) *p = 200; int i = 100;... sub( &i ); 참조에의한호출은주소를복사합니다. 96 int sub( int *p )...... 100 i 96 93 94 95 96 97 98 99 100 p 29

swap() 함수 #1 변수 2 개의값을바꾸는작업을함수로작성 #include <stdio.h> void swap(int x, int y); int a = 100, b = 200; printf("main() a=%d b=%d\n",a, b); swap(a, b); printf("main() a=%d b=%d\n",a, b); return 0; void swap(int x, int y) int tmp; printf("swap() x=%d y=%d\n",x, y); tmp = x; x = y; y = tmp; printf("swap() x=%d y=%d\n",x, y); main() a=100 b=200 swap() x=100 y=200 swap() x=200 y=100 main() a=100 b=200 30

swap() 함수 #2 포인터를이용 #include <stdio.h> void swap(int x, int y); int a = 100, b = 200; printf("main() a=%d b=%d\n",a, b); swap(&a, &b); void swap(int *px, int *py) int tmp; printf("swap() *px=%d *py=%d\n", *px, *py); tmp = *px; *px = *py; *py = tmp; printf("main() a=%d b=%d\n",a, b); return 0; printf("swap() *px=%d *py=%d\n", *px, *py); main() a=100 b=200 swap() *px=100 *py=200 swap() *px=200 *py=100 main() a=200 b=100 31

2 개이상의결과를반환 #include <stdio.h> // 기울기와 y절편을계산 int get_line_parameter(int x1, int y1, int x2, int y2, float *slope, float *yintercept) if( x1 == x2 ) return -1; else *slope = (float)(y2 - y1)/(float)(x2 - x1); 기울기와 y-절편을인수로전달 *yintercept = y1 - (*slope)*x1; return 0; float s, y; if( get_line_parameter(3, 3, 6, 6, &s, &y) == -1 ) printf(" 에러 \n"); else printf(" 기울기는 %f, y절편은 %f\n", s, y); return 0; 기울기는 1.000000, y 절편은 0.000000 32

배열이함수인수인경우 일반변수 vs. 배열 // 매개변수 x 에기억장소가할당된다. void sub(int x)... // 매개변수 b[] 에기억장소가할당되지않는다. void sub(int b[], int n)... 배열의경우, 크기가큰경우에복사하려면많은시간소모 배열의경우, 배열의주소를전달 33

// 포인터와함수의관계 #include <stdio.h> 예제 void sub(int b[], int n); int a[3] = 1,2,3 ; printf("%d %d %d\n", a[0], a[1], a[2]); sub(a, 3); printf("%d %d %d\n", a[0], a[1], a[2]); return 0; void sub(int b[], int n) b[0] = 4; b[1] = 5; b[2] = 6; 1 2 3 4 5 6 34

배열이함수의인수인경우 1/3 35

배열이함수의인수인경우 2/3 36

배열이함수의인수인경우 3/3 37

주의 함수가종료되더라도남아있는변수의주소를반환하여야한다. 지역변수의주소를반환하면, 함수가종료되면사라지기때문에오류 int *add(int x, int y) int result; 지역변수 result 는함수가종료되면소멸되므로그주소를반환하면안된다.!! result = x + y; return &result; 38

포인터사용의장점 연결리스트나이진트리등의향상된자료구조를만들수있다. A N C D E A C D E B B 메인메모리 메인메모리 참조에의한호출 포인터를매개변수로이용하여함수외부의변수의값을변경할수있다. 동적메모리할당 17장에서다룬다. 39

응용예제 #1 한국미국일본 포인터를통한간접접근의장점 현재설정된나라의햄버거의가격을출력 #include <stdio.h> int burger_kor[3]= 3000, 2000, 4000 ; int burger_usa[3]= 3500, 2600, 5000 ; int burger_jap[3]= 3200, 2700, 4500 ; int country; int *p_burger=null; burger_kor[] burger_usa[] burger_jap[] p_burger 포인터를사용하여현재사용자가선택한국가를기억하고있다. printf(" 지역을입력하시요 :"); scanf("%d", &country); if( country == 0 ) p_burger = burger_kor; else if( country == 1 ) p_burger = burger_usa; else p_burger = burger_jap; printf(" 현지역에서의햄버거가격 :"); printf("%d %d %d\n", p_burger[0],p_burger[1],p_burger[2]); return 0; 40

버블정렬 void bubble_sort(int *p, int n) int i, scan; // 스캔회수를제어하기위한루프 for(scan = 0; scan < n-1; scan++) // 인접값비교회수를제어하기위한루프 for(i = 0; i < n-1; i++) // 인접값비교및교환 if( p[i] > p[i+1] ) swap(&p[i], &p[i+1]); void swap(int *px, int *py) int tmp; tmp = *px; *px = *py; *py = tmp; 포인터를통하여배열원소교환 41

배열의최소값과최대값 #include <stdio.h> #define SIZE 10 void get_max_min(int list[], int size, int *pmax, int *pmin); int max, min; int grade[size] = 3, 2, 9, 7, 1, 4, 8, 0, 6, 5 ; get_max_min(grade, SIZE, &max, &min); printf(" 최대값은 %d, 최소값은 %d입니다.\n", max, min); return 0; 42

배열의최소값과최대값 void get_max_min(int list[], int size, int *pmax, int *pmin) int i, max, min; max = min = list[0]; for(i = 1;i < size; i++) if( list[i] > max) max = list[i]; if( list[i] < min) min = list[i]; // 첫번째원소를최대, 최소값으로가정 // 두번째원소부터최대, 최소값과비교 // list[i] 가최대값보다크면 // list[i] 를최대값으로설정 // list[i] 가최소값보다작으면 // list[i] 를최소값으로설정 *pmax = max; *pmin = min; 최대값은 9, 최소값은 0 입니다. 43

Q & A 44