8장. 포인터

Similar documents
Microsoft PowerPoint - ch07 - 포인터 pm0415

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

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint 프레젠테이션

슬라이드 1

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

Microsoft PowerPoint - chap06-8.ppt

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

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

11장 포인터

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

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

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

Data Structure

ch15

untitled

Microsoft PowerPoint - ch07 - 포인터 pm0415

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

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

설계란 무엇인가?

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

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

Microsoft PowerPoint - chap-11.pptx

설계란 무엇인가?

PowerPoint 프레젠테이션

Microsoft PowerPoint - 제11장 포인터

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

PowerPoint Template

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

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

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

11장 포인터

Microsoft PowerPoint - Chapter_08.pptx

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

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - Chapter14_17.pptx

Microsoft PowerPoint - Lesson14.pptx

Microsoft PowerPoint - Lesson14.pptx

OCW_C언어 기초

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

ABC 6장

Microsoft PowerPoint - chap06.ppt

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

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

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

10장. 구조체

ABC 6장

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

PowerPoint 프레젠테이션

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

C 언어와 프로그래밍 개요

Infinity(∞) Strategy

C 언어와 프로그래밍 개요

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

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - chap12-고급기능.pptx

슬라이드 1

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

슬라이드 1

Data Structure

C 언어와 프로그래밍 개요

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

02장.배열과 클래스

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

PowerPoint Presentation

Microsoft PowerPoint - C_9장 포인터 pptx

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

C++ Programming

PowerPoint 프레젠테이션

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

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

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

슬라이드 1

Microsoft PowerPoint - 7장 배열 pptx

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

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

C 언어와 프로그래밍 개요

C 프로그래밊 개요

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

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

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

PowerPoint Presentation

PowerPoint Template

PowerPoint Presentation

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

PowerPoint 프레젠테이션

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


untitled

C 프로그래밊 개요

OCW_C언어 기초

OCW_C언어 기초

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

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

Microsoft PowerPoint - chap04-연산자.pptx

Microsoft PowerPoint - chap09-1.ppt

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

untitled

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

Transcription:

2019-1 st 프로그래밍입문 (1) 8 장포인터 박종혁교수 서울과학기술대학교컴퓨터공학과 UCS Lab Tel: 970-6702 Email: jhpark1@seoultechackr

목차 포인터의기본 포인터의개념 포인터의선언및초기화 포인터의사용 포인터의용도 포인터사용시주의사항 참조에의한호출 배열과포인터의관계 calloc() 과 malloc() 을이용한동적메모리할당 2

포인터의개념 (1/2) 포인터 (pointer) 는주소 (address) 를저장하는변수 메모리에는각각의바이트를구분하기위한주소 ( 번지 ) 가있음 주소의크기도플랫폼에따라다름 32 비트플랫폼에서는주소가 4 바이트, 64 비트플랫폼에서는주소가 8 바이트 3

포인터의개념 (2/2) 포인터를사용할때는주소값이아니라포인터가어떤변수를가리키는지가중요 포인터는다른변수를가리키는변수 포인터는주소를이용해서다른변수에접근 4

포인터의선언 포인터를선언할때지정하는데이터형은포인터가가리키는변수의데이터형 5

포인터의의미 6

포인터의크기 포인터의데이터형이다르더라도포인터의크기는항상같음 포인터의크기는플랫폼에의해서결정 - 32 비트 4B, 64 비트 8B 7

예제 : 포인터의바이트크기구하기 8

포인터의초기화 포인터에직접절대주소를대입해서는안됨 변수의주소를구할때는주소구하기연산자인 & 를이용 어떤변수의주소로초기화할지알수없으면 0 으로초기화 9

예제 : 포인터의선언및초기화 10

포인터의사용 주소구하기연산자 & 변수 (l-value) 에만사용가능 int x = 10; int *p = &x; 상수나수식에는사용불가 p = &123; // ERROR p = &(x + 1); // ERROR p = &printf("hello"); // ERROR x 는포인터가아니므로 * 를사용할수없음 역참조 ( 간접참조 ) 연산자 * 포인터가가리키는변수에접근 printf("%d", *p); *p = 20; p 가가리키는 int 변수에대입 p 가가리키는 int 변수를출력 포인터에만사용할수있으며, 포인터가아닌변수나수식에는사용할수없음 int x = 10; *x = 30; // ERROR *(x + 1) = 40; // ERROR 수식에는 * 를사용할수없음 11

주소연산자 & 특정변수의포인터를구하기위해서는주소연산자 (&) 를사용 포인터를구하여출력 char ch; int in; double db; printf( ch 의포인터 : %u\n, &ch); printf( in 의포인터 : %u\n, &in); printf( db 의포인터 : %u\n, &db); 12

역참조연산의의미 13

예제 : 포인터의사용 14

포인터의용도 (1/2) 변수의이름을직접사용할수없을때 함수를호출한곳에있는지역변수를포인터를이용해서변경할수있음 15

예제 : 포인터가필요한경우 16

포인터사용시주의사항 (1/2) 포인터는초기화하고사용하는것이안전 포인터를초기화하지않고사용하면실행에러가발생 int *q; // 쓰레기값 *q = 10; // 실행에러발생 어떤변수를가리킬지알수없으면널포인터로초기화 int *q = NULL; 포인터를안전하게사용하려면사용할때널포인터인지검사 - 널포인터가아닌경우에만포인터가가리키는변수에접근 if (q!= NULL) // 널포인터검사 *q = 100; if (q) *q = 100; // 널포인터검사 17

포인터사용시주의사항 (2/2) 포인터의데이터형과포인터가가리키는변수의데이터형이같아야함 18

포인터와 +, - 연산 (1/2) p+n 연산의결과는 p 가가리키는데이터형 N 개크기만큼더한주소 19

예제 : ' 포인터 + 정수 ' 연산의결과 20

포인터와 +, - 연산 (2/2) ' 포인터 + 정수 ' 연산은포인터가가리키는주소에마치배열이있는것처럼메모리에접근 21

예제 : 배열의 0 번원소를가리키는포인터의 +, - 연산 22

포인터와 ++, -- 연산 (1/2) p++, ++p p 가가리키는데이터형 1 개크기만큼주소를증가 p--, --p p 가가리키는데이터형 1 개크기만큼주소를감소 23

예제 : 배열의 0 번원소를가리키는포인터와증감연산 24

포인터와 ++, -- 연산 (2/2) 증감연산자와역참조연산자를함께사용할때는연산자우선순위를신경써야함 *p++ 은 *(p++) 를의미 // *(p+1) 포인터 p 의주소값의증가 for (i = 0; i < 5; i++) { printf("p= %p, ", p); printf("*p = %d\n", *p++); } *p 를출력한다음 p++ 을수행한다 for (i = 0; i < 5; i++) { printf("p= %p, ", p); printf("*p = %d\n", (*p)++); } p 가가리키는 arr[0] 을증가시킨다 p 는변경되지않는다 // 포인터 p 가가리키는곳의저장된값의증가 25

배열처럼사용되는포인터 (1/3) 배열원소를가리키는포인터 type 형의포인터는항상 type 형의변수또는 type 형배열의원소를가리킬수있음 26

배열처럼사용되는포인터 (2/3) 배열원소를가리키는포인터는배열이름인것처럼사용할수있음 for (i = 0; i < 5; i++) printf("%d ", p[i]); p 를배열이름인것처럼사용한다 27

배열처럼사용되는포인터 (3/3) 배열의원소를가리키는포인터는배열의어떤원소든지가리킬수있음 28

예제 : 포인터를배열인것처럼사용하는경우 29

함수의인자전달방법 값에의한전달 (passing by value) 인자를매개변수로복사해서전달하는방식 복사에의한전달 포인터에의한전달 (passing by pointer) 변수의주소를전달하는방식 함수를호출한곳에있는지역변수의주소를매개변수로받아오면포인터를통해서해당변수에접근할수있다 함수의처리결과를매개변수로전달할때유용하게사용 30

값에의한전달 : swap 함수 31

포인터에의한전달 : swap 함수 32

예제 : 포인터에의한전달방법으로구현한 swap 함수 33

함수의처리결과를매개변수로전달하는방법 함수의원형을정할때, 처리결과를저장할변수를가리키는포인터형으로매개변수를선언 함수를호출할때, 처리결과를받아올변수의주소를전달 함수를정의할때, 포인터형의매개변수가가리키는곳에처리결과를저장 34

예제 : 함수의처리결과를매개변수로전달하는경우 35

배열의전달 (1/2) 함수의매개변수는배열원소에대한포인터형으로선언 함수를정의할때배열의크기가필요하면배열의크기도매개변수로받아와야함 36

배열의전달 (2/2) 배열을매개변수로가진함수를호출할때는배열의이름을인자로전달 함수를정의할때는매개변수인포인터를배열이름인것처럼인덱스와함께사용 37

배열 vs 포인터 배열이름은특정변수전용포인터인것처럼사용할수있음 배열의시작주소는변경할수없음 int x[5] = { 1, 2, 3, 4, 5 }; int y[5]; 포인터는값을변경할수있으므로포인터에보관된주소는변경할수있음 int x[5] = { 1, 2, 3, 4, 5 }; int y[5]; int *p = x; p = y; // OK y = x; // 컴파일에러 x++; // 컴파일에러 배열의시작주소는변경할수없다 38

예제 : 배열과포인터의차이점 39

배열과포인터의관계 a와 p는포인터이고둘다첨자를붙일수도있음 a[i] *(a + i) p[i[ *(p + i) 포인터변수는다른값을가질수있지만, 배열이름은안됨 p = a + i ; a = q ; /* error */ 40

배열과포인터의관계 예제코드 ( 배열의합구하기 ) #define N 100 int * p, a[n], sum ; Version 1 for ( i=0, sum=0; I<N; ++i ) Sum += a[i]; /* 또는 sum += *(a+i); */ Version 2 for ( p=a, sum=0; p < &a[n]; ++p ) Sum += *p; Version 1 for ( p=a, i=0, sum=0; i<n; ++I ) Sum += p[i]; 41

포인터배열 배열의원소의형은포인터형을포함하여임의의형이될수있음 포인터배열은문자열을다룰때많이사용됨 42

포인터배열 1 차원배열의배열명을포인터배열에저장하면포인터배열을 2 차원배열처럼사용할수있음 int ary1[4]={1,2,3,4}; int ary2[4]={11,12,13,14}; int ary3[4]={21,22,23,24}; int *ptr_ary[3]={ary1,ary2,ary3}; // 각배열명을포인터배열에초기화 ary3 배열의세번째배열요소 (23 값 ) 를참조하는과정 1. 먼저 ptr_ary 배열의세번째배열요소를참조 ptr_ary[2] 2. 참조된배열요소 ptr_ary[2] 는배열명 ary3 를저장한포인트변수이므로배열명처럼사용하여 ary3 의세번째배열요소를참조 printf( %d,ptr_ary[2][2]); 43

포인터배열 ptr_ary[2][2] 가참조되는과정의주소값을계산 일단포인터표현으로바꾸고연산순서를따라감 1 번연산 : 포인터배열의세번째배열요소를가리키는포인터가구해짐 44

포인터배열 2 번연산 : 포인터배열의세번째배열요소의값 300 번지가구해짐 3 번연산 : ary3 배열의세번째기억공간을가리키는포인터가구해짐 4 번연산 : 308 번지는포인터이므로참조연산을수행하면값 23 이참조됨 45

포인터배열 #include <stdio.h> int main() { int ary1[4]={1,2,3,4}; int ary2[4]={11,12,13,14}; int ary3[4]={21,22,23,24}; int *ptr_ary[3]={ary1,ary2,ary3}; int i, j; // 포인터배열에각배열명을초기화한다 // 반복제어변수 } for(i=0;i<3;i++){ for(j=0;j<4;j++){ printf( %5d,ptr_ary[i][j]); // 3행 4열의 2차원배열처럼출력할수있다 } printf( \n ); // 한행을출력한후에줄을바꾼다 } return 0; 46

const 포인터 47

const 데이터형 * 변수 ; 읽기전용포인터 포인터가가리키는변수의값을변경할수없음 int a = 10, b = 20; const int *p1 = &a; // 읽기전용포인터 a = 100; (*p1)++; a를직접변경할 // OK 수는있다 // 컴파일에러 printf("*p1 = %d\n", *p1); // OK *p1 = 100; // 컴파일에러 p1 으로접근할때는변경할수없다 *p1 // 포인터 p1이가리키는값은읽기전용으로변경될수없음 a 10 20 b 100 (X) 48

const 데이터형 * 변수 ; 포인터자신의값 ( 포인터에저장된주소 ) 은변경할수있음 - 포인터가다른변수를가리키게만들수는있음 p1 = &b; printf("*p1 = %d\n", *p1); // 이제 p1은 b를가리킨다 // p1이가리키는 b를출력한다 p 1024 *p1 1028 (o) a 1024 b 1028 10 20 선언시널포인터로초기화하고, 원하는시점에특정변수의주소를저장하고사용할수있음 49

데이터형 * const 변수 ; 특정변수의전용포인터 포인터자신의값 ( 포인터에저장된주소 ) 을변경할수없음 다른변수를가리킬수없음 int *const p2 = &a; p2 = &b; // a 전용포인터 // 컴파일에러 p2 1024 1028 (X) a 10 1024 20 b 1028 50

데이터형 * const 변수 ; 포인터가가리키는변수의값은변경할수있음 *p2 = 100; // p2 가가리키는변수의값을변경할수있다 p2 1024 1028 (X) a 10 100 1024 20 b 1028 선언시반드시참조하려는값으로초기화해야함 int *const p2; // 초기화하지않으면 p2 는쓰레기값이고나중에주소를저장할수도없다 51

const 데이터형 * const 변수 ; 읽기전용포인터이면서특정변수전용포인터 반드시초기화해야하며, 이포인터로는가리키는변수의값도변경할수없고포인터자신의값 ( 포인터에저장된주소 ) 도변경할수없음 const int * const p3 = &a; // a 전용포인터이면서 a에읽기전용으로접근 *p3 = 100; // 컴파일에러 p3 = &b; // 컴파일에러 52

예제 : const 포인터의의미 53

이중포인터 포인터의포인터 더블포인터 싱글포인터의주소값을저장하는용도의포인터 int main(void) { double val=314; double *ptr1=&val // 싱글포인터 double **ptr2=&ptr1; // 더블포인터 } 54

이중포인터 이중포인터의해석 55

이중포인터 사용예제 #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); 출력결과 i=200 *p=200 **q=200 i=300 *p=300 **q=300 **q=300; printf( i=%d *p=%d **q=%d \n, i, *p, **q); } return 0; 56

main() 함수의인자 main() 은운영체제와의통신을위해 argc 와 argv 라는인자를사용함 예제코드 void main(int argc, char *argv[]) { int i; printf("argc = %d\n", argc); for (i = 0; i < argc; ++i) printf("argv[%d] = %s\n", i, argv[i]); } argc : 명령어라인인자의개수를가짐 argv : 명령어라인을구성하는문자열들을가짐 57

main() 함수의인자 앞의프로그램을컴파일하여 my_echo 로한후, 다음명령으로실행 : $ my_echo a is for apple 출력 : argc = 5 argv[0] = my_echo argv[1] = a argv[2] = is argv[3] = for argv[4] = apple 58

인수전달방법 다른예제 C: \cprogram> mycopy src dst 59

main_argc #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; } c:\cprogram\mainarg\debug>mainarg src dst 명령어라인에서 0번째문자열 = mainarg 명령어라인에서 1번째문자열 = src 명령어라인에서 2번째문자열 = dst c:\cprogram\mainarg\debug> 60

calloc() 과 malloc() stdlib.h에정의되어있음 calloc : contiguous allocation malloc : memory allocation 프로그래머는 calloc() 과 malloc() 을사용하여배열, 구조체, 공용체를위한공간을동적으로생성함 61

calloc() 과 malloc() 각원소의크기가 el_size 인 n 개의원소를할당하는방법 Calloc(n, el_size); Malloc(n *el_size); calloc() 은모든원소를 0으로초기화하는반면 malloc() 은하지않음 할당받은것을반환하기위해서는 free() 를사용 62

예제 - calloc() 과 malloc() #include <stdio.h> #include <stdlib.h> Int main(void){ int *a; /* to be used as an array */ int n ; /* the size of the array */ /* get n from somewhere, perhaps interactively from the user */ a = calloc(n, sizeof(int)); /* get space for a */ free(a); } 63

calloc() 과 malloc() Calloc 함수는배열을할당받고초기화 첫번째배열요소의개수, 두번째는배열요소의크기를전달인자로줌 double형변수 5개로사용할배열을할당받는경우 double *dp; 배열요소의개수 dp=(double *)calloc(5, sizeof(double)); double *ap; int i; ap=(double *)calloc(5, sizeof(double)); for(i=0;i<5;i++){ printf( %lf\n,ap[i]); } double 형변수하나의크기 모두 0 으로초기화된다 64

calloc() 과 malloc() #include <stdio.h> #include <stdlib.h> // malloc 함수를사용하기위해서포함시킨다 int main() { int *ip; double *dp; //int 형을가리킬포인터변수 //double 형을가리킬포인터변수 ip=(int *)malloc(sizeof(int)); // 기억공간을동적으로할당받아서 dp=(double *)malloc(sizeof(double)); // 각포인터변수에연결시킨다 *ip=10; *dp=34; // 포인터변수로각각할당받은기억공간을 // 참조하여값을저장한다 printf(" 정수형으로사용 : %d\n", *ip); printf(" 실수형으로사용 : %lf\n", *dp); return 0; } 65

calloc() 과 malloc() 메모리의동적할당은많은기억공간을한꺼번에할당받아서 배열로사용하는것이효율적 int 형변수 5 개를동적으로할당받는경우 int *ip; ip = (int *)malloc(20); // 포인터변수선언 //20바이트를한꺼번에할당받음 66

calloc() 과 malloc() #include <stdio.h> #include <stdlib.h> // malloc 함수를사용하기위해서포함시킨다 int main(){ int *ip; int i, sum=0; ip=(int*)malloc(5*sizeof(int)); if(ip==0){ printf(" 메모리가부족합니다!\n"); return 1; // 전체 20바이트의기억공간할당 // 메모리가할당되었는지확인하여 // 메모리가부족하면메시지를출력하고 // 프로그램을종료한다 } printf(" 다섯명의나이를입력하세요 : "); for(i=0; i<5; i++){ scanf("%d", ip+i); sum+=ip[i]; // 데이터를저장할포인터를전달한다 // 입력된값을참조하여누적한다 } printf(" 다섯명의평균나이 : %d\n", sum/5); free(ip); // 평균나이출력 // 할당받은메모리반환 } return 0; 67

68

calloc() 과 malloc() 메모리동적할당을사용하면입력되는문자열의길이에맞게기억공간을할당할수있음 1 문자열을입력받기전에는그길이를알수없으므로우선충분한크기의문자배열이필요 2 문자배열에문자열을입력 3 문자열의길이를계산하여그크기에맞는기억공간을동적으로할당 4 동적으로할당받은기억공간에입력받은문자열을복사 69

포인터의용도 포인터가어떤변수를가리키게될지아직모르는경우 포인터가가리키는변수가프로그램실행중에조건에따라서결정 여러변수에대한처리를공통의코드로수행하게만들수있음 70

구현사례 1 : 효과없는 swap 함수의호출 /* ptr_swap1c */ void pswap(int *p1, int *p2) #include <stdio.h> { void pswap(int *p1, int *p2); int *temp; int main(void) temp=p1; { p1=p2; int A=10, B=20; p2=temp; int *pa, *pb; } pa=&a, pb=&b; pswap(pa, pb); } printf("pa 가가리키는변수 : %d \n", *pa); printf("pb 가가리키는변수 : %d \n", *pb); return 0; 71

구현사례 2 : 효과없는 swap 함수의호출 /* ptr_swap2c */ void pswap(int **p1, int **p2) #include <stdio.h> { void pswap(int **p1, int **p2); int *temp; int main(void) temp=*p1; { *p1=*p2; int A=10, B=20; *p2=temp; int *pa, *pb; } pa=&a, pb=&b; pswap(&pa, &pb); } printf("pa 가가리키는변수 : %d \n", *pa); printf("pb 가가리키는변수 : %d \n", *pb); return 0; 72

73

참고문헌 천정아, Core C Programming, 연두에디션 (2019) C 가보이는그림책, ANK Co, Ltd, 성안당 (2018) Greg Perry, Dean Miller 어서와 C 언어는처음이지, 천인국옮김, 인피니티북스 (2015) KELLEY ( 역 : 김명호외 ), A Book on C, 홍릉과학출판사 (2003) 윤성우, 열혈 C 프로그래밍, 오렌지미디어 천인국, 쉽게풀어쓴 C 언어 Express, 생능출판사 서현우, 뇌를자극하는 C 프로그래밍, 한빛미디어 강성수, 쾌도난마 C 프로그래밍, 북스홀릭 고응남, C 프로그래밍기초와응용실습, 정익사 74