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

Similar documents
Microsoft PowerPoint - 제11장 포인터

11장 포인터

Microsoft PowerPoint - ch07 - 포인터 pm0415

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

untitled

Microsoft PowerPoint - chap-11.pptx

Microsoft PowerPoint - ch07 - 포인터 pm0415

Data Structure

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

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

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

PowerPoint 프레젠테이션

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

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

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

슬라이드 1

설계란 무엇인가?

Microsoft PowerPoint - chap06-2pointer.ppt

ch15

PowerPoint 프레젠테이션

OCW_C언어 기초

Microsoft PowerPoint - Chapter_08.pptx

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

11장 포인터

PowerPoint Template

02장.배열과 클래스

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

설계란 무엇인가?

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

KNK_C_05_Pointers_Arrays_structures_summary_v02

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

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

PowerPoint Presentation

Microsoft PowerPoint - C_9장 포인터 pptx

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

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

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

untitled

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

쉽게 풀어쓴 C 프로그래밍

untitled

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

중간고사

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

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

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

Microsoft PowerPoint - chap06-1Array.ppt

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

Data Structure

PowerPoint 프레젠테이션

ABC 6장

<4D F736F F F696E74202D20C1A633C0E52043C7C1B7CEB1D7B7A5B1B8BCBABFE4BCD2>

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

Microsoft PowerPoint - chap-03.pptx

chap 5: Trees

Microsoft PowerPoint - 05-chap03-ArrayAndPointer.ppt

PowerPoint 프레젠테이션

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

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

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - Chapter14_17.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - chap12-고급기능.pptx

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

Microsoft PowerPoint - chap04-연산자.pptx

쉽게 풀어쓴 C 프로그래밍

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

Microsoft PowerPoint - Lesson2.pptx

8장. 포인터

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

C 프로그래밊 개요

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

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

Microsoft PowerPoint - C++ 5 .pptx

Infinity(∞) Strategy

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

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

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 - 04_C_Language_Function

Microsoft PowerPoint - [2009] 02.pptx

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

슬라이드 1

Microsoft PowerPoint - 7장 배열 pptx

Microsoft PowerPoint - chap-09.pptx

쉽게 풀어쓴 C 프로그래밍

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 \

PowerPoint Presentation

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

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

1.2 자료형 (data type) 프로그램에서다루는값의형태로변수나함수를정의할때주로사용하며, 컴퓨터는선언된 자료형만큼의메모리를확보하여프로그래머에게제공한다 정수 (integer) 1) int(4 bytes) 연산범위 : (-2 31 ) ~ (2 31 /2)-

untitled

슬라이드 1

Microsoft PowerPoint - Chapter8.pptx

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

<4D F736F F F696E74202D20C1A639C0E520C7D4BCF6BFCDBAAFBCF6>

PowerPoint 프레젠테이션

중간고사 (자료 구조)

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

Transcription:

쉽게풀어쓴 C 언어 Express 제 11 장포인터

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

포인터란? 포인터 (pointer): 주소를가지고있는변수 1003 1004 1005 영화관 1002 1006 1001 포인터 (pointer) 1007

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

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

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

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

포인터의선언 포인터 : 변수의주소를가지고있는변수 *p 가가리키는내용은정수가된다. * 가우선순위가높아서 p 는포인터가된다.

포인터와변수의연결 int i = 10; int *p; p = &i; // 정수형변수 i 선언 // 포인터변수 p 선언 // 변수 i의주소가포인터 p로대입

다양한포인터의선언 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

간접참조연산자 간접참조연산자 *: 포인터가가리키는값을가져오는연산자 int i=10; int *p; p =&i; printf( %d, *p):

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

& 연산자와 * 연산자 & 연산자 : 변수의주소를반환한다 * 연산자 : 포인터가가리키는곳의내용을반환한다.

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

포인터예제 #2 #include <stdio.h> int main(void) int x=10, y=20; int *p; p = &x; printf("p = %d\n", p); printf("*p = %d\n\n", *p); p 10 x 20 y p = &y; printf("p = %d\n", p); printf("*p = %d\n", *p); return 0; p = 1245052 *p = 10 p = 1245048 *p = 20

포인터예제 #3 #include <stdio.h> int main(void) int i=10; int *p; p = &i; printf("i = %d\n", i); p i 10 *p = 20; printf("i = %d\n", i); return 0; 포인터를통하여변수의값을변경한다. i= 10 i= 20

중간점검 메모리는어떤단위를기준으로주소가매겨지는가? 다음의각자료형이차지하는메모리공간의크기를쓰시오. (a) char (b) short (c) int (d) long (e) float (f) double 포인터도변수인가? 변수의주소를추출하는데사용되는연산자는무엇인가? 변수 x의주소를추출하여변수 p에대입하는문장을쓰시오. 정수형포인터 p가가리키는위치에 25를저장하는문장을쓰시오.

포인터사용시주의점 초기화가안된포인터를사용하면안된다. int main(void) int *p; // 포인터 p는초기화가안되어있음 *p = 100; // 위험한코드 return 0; 주소가잘못된것같은데 p

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

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

중간점검 초기값이결정되지않은포인터에는어떤값을넣어두는것이안전한가? char형변수에 double형포인터로값을저장한다면어떤문제가발생하는가?

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

증가연산예제 #include <stdio.h> int main(void) 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

포인터의증감연산

간접참조연산자와증감연산자 *p++; p가가리키는위치에서값을가져온후에 p를증가한다. (*p)++; p가가리키는위치의값을증가한다. 수식 의미 v = *p++ p 가가리키는값을 v 에대입한후에 p 를증가한다. v = (*p)++ p 가가리키는값을 v 에대입한후에가리키는값을증가한다. v = *++p p 를증가시킨후에 p 가가리키는값을 v 에대입한다. v = ++*p p 가가리키는값을가져온후에그값을증가하여 v 에대입한다.

간접참조연산자와증감연산자 #include <stdio.h> int main(void) int i = 10; int *pi = &i; pi 가가리키는위치의값을증가한다. 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; pi 가가리키는위치에서값을가져온후에 pi 를증가한다. i = 10, pi = 0012FF60 i = 11, pi = 0012FF60 i = 11, pi = 0012FF60 i = 11, pi = 0012FF64

포인터의형변환 C 언어에서는꼭필요한경우에, 명시적으로포인터의타입을변경할수있다. double *pd = &f; int *pi; pi = (int *)pd;

간접참조연산자와증감연산자 #include <stdio.h> int main(void) char buffer[8]; double *pd; int *pi; pd = (double *)buffer; *pd = 3.14; printf("%f\n", *pd); pi = (int *)buffer; *pi = 123; *(pi+1) = 456; char 형포인터를 double 형포인터로변환, 배열의이름은 char 형포인터이다. char 형포인터를 int 형포인터로변환 printf("%d %d\n", *pi, *(pi+1)); return 0; 3.140000 123 456

중간점검 포인터에대하여적용할수있는연산에는어떤것들이있는가? int형포인터 p가 80번지를가리키고있었다면 (p+1) 은몇번지를가리키는가? p가포인터라고하면 *p++ 와 (*p)++ 의차이점은무엇인가? p가포인터라고하면 *(p+3) 의의미는무엇인가?

포인터와배열 배열과포인터는아주밀접한관계를가지고있다. 배열이름이바로포인터이다. 포인터는배열처럼사용이가능하다. a 배열 [0] [1] [2] [3] [4] [5] [6] [7] [8] 배열 포인터 p 포인터

포인터와배열 // 포인터와배열의관계 #include <stdio.h> int main(void) 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

포인터와배열 // 포인터와배열의관계 #include <stdio.h> int main(void) 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

포인터와배열 포인터는배열처럼사용할수있다. 인덱스표기법을포인터에사용할수있다.

포인터를배열처럼사용 #include <stdio.h> int main(void) 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

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

실습 : 영상처리 디지털이미지는배열을사용하여서저장된다. 이미지처리를할때속도를빠르게하기위하여포인터를사용한다. 이미지내의모든픽셀의값을 10씩증가시켜보자.

실행결과 010 020 030 040 050 010 020 030 040 050 010 020 030 040 050 010 020 030 040 050 010 020 030 040 050 모든픽셀의값이 10 씩증가되었다. 020 030 040 050 060 020 030 040 050 060 020 030 040 050 060 020 030 040 050 060 020 030 040 050 060

실습 : 영상처리 #include <stdio.h> #define SIZE 5 void print_image(int image[][size]) int r,c; for(r=0;r<size;r++) for(c=0;c<size;c++) printf("%03d ", image[r][c]); printf("\n"); printf("\n");

실습 : 영상처리 void brighten_image(int image[][size]) int r,c; int *p; p = &image[0][0]; for(r=0;r<size;r++) for(c=0;c<size;c++) *p += 10; p++;

실습 : 영상처리 int main(void) int image[5][5] = 10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 10, 20, 30, 40, 50; print_image(image); brighten_image(image); print_image(image); return 0;

도전문제 포인터를이용하지않는버전도작성하여보자. 즉배열의인덱스표기법으로위의프로그램을변환하여보자.

배열의원소를역순으로출력 #include <stdio.h> void print_reverse(int a[], int n); int main(void) 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

중간점검 배열의첫번째원소의주소를계산하는 2가지방법을설명하라. 배열 a[] 에서 *a의의미는무엇인가? 배열의이름에다른변수의주소를대입할수있는가? 포인터를이용하여배열의원소들을참조할수있는가? 포인터를배열의이름처럼사용할수있는가?

인수전달방법 함수호출시에인수전달방법 값에의한호출 (call by value) C 에서기본적인방법 참조에의한호출 (call by reference) C 에서는포인터를이용하여흉내낼수있다.

값에의한호출 함수호출시에변수의값을함수에전달 값에의한호출은값만을복사해요. 100 int main(void) int i = 100; 100 i int sub( int v ) 100 v... sub( i );......

참조에의한호출 함수호출시에변수의주소를함수의매개변수로전달 참조에의한호출은주소를복사합니다. 96 int main(void) int i = 100;... sub( &i ); int sub( int *p )...... 100 i 96 93 94 95 96 97 98 99 100 p

swap() 함수 #1 변수 2 개의값을바꾸는작업을함수로작성 #include <stdio.h> void swap(int x, int y); int main(void) int a = 100, b = 200; swap(a, b); return 0; void swap(int x, int y) int tmp; tmp = x; x = y; y = tmp; 함수호출시에값만복사된다. 100 a <main> 200 100 200 200 100 b y x <swap> 100 tmp

swap() 함수 #2 포인터를이용 #include <stdio.h> void swap(int x, int y); int main(void) int a = 100, b = 200; swap(&a, &b); return 0; void swap(int *px, int *py) int tmp; tmp = *px; *px = *py; *py = tmp; 함수호출시에주소가복사된다. 100 tmp 100 200 &a a px 200 100 &b b py <main> <swap>

scanf() 함수 변수에값을저장하기위하여변수의주소를받는다.

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); *yintercept = y1 - (*slope)*x1; return 0; int main(void) 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; 기울기와 Y 절편을인수로전달 기울기는 1.000000, y 절편은 0.000000

배열매개변수 일반매개변수 vs 배열매개변수 // 매개변수 x에기억장소가할당 void sub(int x)... // b에기억장소가할당되지않는다. void sub( int b[] )... Why? -> 배열을함수로복사하려면많은시간소모

배열매개변수

예제 #include <stdio.h> void sub(int b[], int n); int main(void) int a[3] = 1,2,3 ; 1 2 3 4 5 6 a[0] a[1] a[2] 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

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

중간점검 함수에매개변수로변수의복사본이전달되는것을 라고한다. 함수에매개변수로변수의원본이전달되는것을 라고한다. 배열을함수의매개변수로지정하는경우, 배열의복사가일어나는가?

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

Q & A