2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] -...

36
10 포인터 10 포인터 조선대학교 전자공학과 장순석 교수 1

Transcript of 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] -...

Page 1: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

10 포인터10 포인터

조선대학교 전자공학과 장순석 교수

1

Page 2: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

주소주소

Address(주소) 메모리에는그메모리의저장장소의위치를나타내는주소값

주소(address)는 1바이트마다 1씩증가하도록메모리에는연속적인번호가구성번호가구성

한국대학교 객체지향연구소2

Page 3: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

주소 연산자 &주소 연산자 &

&변수변수의주소값을알아내려면변수앞에 주소연산자 & 변수의주소값을알아내려면변수앞에 주소연산자 & (ampersand)를이용

주소 값 이용 장단점주소 값 이용 장단점 주소값을이용하면보다편리하고융통성있는프로그램이가능

그러나복잡하고어려운단점

한국대학교 객체지향연구소3

Page 4: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

예제 10-1예제 10 1

한국대학교 객체지향연구소4

Page 5: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

포인터 변수포인터 변수

의미

포인터변수는일반변수와는다르게변수에저장되는값이메모리의주소(address) 값만을저장할수있는특별한변수

포인터변수를이용하면프로그램이간결하고효율적이므로포인터변수를이용

포인터 변수의 선언

포인터변수는그포인터가가리키는변수의자료형에맞추어형을선언해야함

한국대학교 객체지향연구소5

Page 6: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

포인터 변수 선언포인터 변수 선언

여러 개의 포인터 변수를 한 번에 선언 다음은 ptr1만포인터변수 다음은 ptr1만포인터변수

int* ptr1, ptr2, ptr3;

세변수를모두포인터변수로선언하려면다음과같이

int *ptr1, *ptr2, *ptr3;

아무값이없다는의미의 NULL• 주소값 0을의미

• stdio.h에정의

int *ptr = NULL;

#define NULL ((void *) 0);

한국대학교 객체지향연구소6

Page 7: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

포인터 변수의 값포인터 변수의 값

포인터 변수는 주소(address) 값만을 저장 포인터변수는주소(address)값만을저장할수있으므로초기값지정가능 포인터변수는주소(address) 값만을저장할수있으므로초기값지정가능

위구문으로변수 ptr에는변수 i의주소값이저장• 그러므로 *ptr은변수 i 자체를의미

한국대학교 객체지향연구소7

Page 8: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

역참조 연산자역참조 연산자

참조(reference) 포인터변수 ptr은변수 i를참조한다 포인터변수 ptr은변수 i를참조한다.

역참조 연산자 * 역참조연산자는포인터변수앞에연산자 *를붙이면그포인터가가리키는변수를지칭가리키는변수를지칭

*ptr == i 연산자 *는포인터변수를뒤에기술하면역참조(dereference) 연산자

한국대학교 객체지향연구소8

Page 9: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

예제 10-3예제 10 3

한국대학교 객체지향연구소9

Page 10: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

다양한 포인터 변수의 자료유형다양한 포인터 변수의 자료유형

포인터 변수도 자료유형이 존재

그러나포인터변수의크기는모두 4바이트 그러나포인터변수의크기는모두 4바이트• int *pi;• double *pd;

자료유형이 호환이 안되면 오류 발생

서로다른모든포인터변수는호환이안됨

char C = ‘@’;int *i = &C; //경고 발생Char *pc = &C;p ;

한국대학교 객체지향연구소10

Page 11: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

다양한 포인터 변수의 필요성다양한 포인터 변수의 필요성

동일한 유형의 포인터 변수들 간에만 대입이 가능한 이유는 무엇일까? 포인터변수는참조변수의시작주소값을저장하고 이주소값을 포인터변수는참조변수의시작주소값을저장하고, 이주소값을시작하여어디까지의변수크기로내용값을인지할지의여부를결정해야하기때문

포인터변수가참조하는변수의자료유형을알아야하기때문에모든일반변수가갖는다양한종류의포인터변수가필요

한국대학교 객체지향연구소11

Page 12: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

포인터 변수 연산포인터 변수 연산

+, - 연산 정수 int포인터변수인 ptr에서포인터변수연산식인 (ptr+1)의의미 정수 int 포인터변수인 ptr에서포인터변수연산식인 (ptr+1)의의미

• ptr이가리키는 int 형변수의다음에위치한 int 형변수의첫주소• int 형의저장공간의크기가 4이므로 (ptr+1)은 ptr보다 4가큰주소값• 만일 ptr이 double 형의포인터였다면 (ptr+1)은 ptr보다 8이큰주소값

한국대학교 객체지향연구소12

Page 13: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

포인터 변수 변환포인터 변수 변환

포인터 변수는 자동으로 형변환(cast)이 불가능하며 필요하면명시적으로 형변환을 수행명시적으로 형변환을 수행

char *pc = (char *)&i;• 포인터변수 pc는변수 i의첫주소에서부터 1바이트크기의 char 형자료를참조한다는것을의미자료를참조한다는것을의미

• (*pc)는변수 i의첫주소에서부터 1바이트에저장된값인 65의아스키코드문자인 ’A’를참조

한국대학교 객체지향연구소13

Page 14: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

다양한 포인터 변수의 변환다양한 포인터 변수의 변환

포인터 변수와 그 변환

한국대학교 객체지향연구소14

Page 15: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

void *void 자료유형 (void *)는모든유형의포인터변수값을저장할수있는능력을가진자유로운포인터변수

• int i = 100;• double d = 5.2876;• void *p;void p;• p = &i;• p = &d;

변수 p는 (int *)이든 (double *)이든상관없이모든포인터값을 변수 p는 (int ) 이든 (double )이든상관없이모든포인터값을저장가능

• (void *) 유형인변수가그주소값의변수를참조하려면바로참조할수는없으며유형변환에의하여참조가가능수는없으며유형변환에의하여참조가가능

int i = 100;void *p = &i;

i f(" % \ " ) // 내부의 저장 값 출력printf("p = %#p\n", p); // p 내부의 저장 값 출력printf("(int *)p = %#p\n", (int *)p); // p 내부의 저장 값을 변환하여printf("*(int *)p = %d\n", *(int *)p); // p가 참조하는 변수를 출력//printf("*p = %d\n", *p); //오류 발생

한국대학교 객체지향연구소15

//printf( p %d\n , p); //오류 발생

Page 16: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

예제 10-7예제 10 7

한국대학교 객체지향연구소16

Page 17: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

배열과 포인터배열과 포인터

포인터를 이용하여 배열의 각 원소를 참조하는 방법

다음과같은배열선언에서 다음과같은배열선언에서

int point[] = {95, 88, 76, 54, 85, 82};

변수 point[]는 int 형원소 6개를저장할수있는배열을의미 그렇다면 point는 무엇으로 이용할 수 있을까?

위에서 point는배열의첫원소인 point[0]의주소• point는주소상수로배열의첫번째원소의주소값

point == &point[0]

주소상수 point에역참조연산자 *를이용하면바로변수 point[0]를지칭하므로다음이성립

point == &point[0]

지칭하므로다음이성립

*point == point[0]

한국대학교 객체지향연구소17

Page 18: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

배열 이름을 이용한 원소 참조배열 이름을 이용한 원소 참조

배열이름을 이용한 point + 1(주소상수 + 1)은 무엇일까? 주소값 point의다음원소의주소값을의미 주소값 point의다음원소의주소값을의미 즉 point + 1은 &point[1]을의미하며, point[1]의주소값

주소값 point + 1은실제의주소값으로살펴보면 point의실제주소값에int형의크기만큼더한주소값을의미int 형의크기만큼더한주소값을의미

배열 이름인 point와 역참조 연산자 *를 이용한 식*point == point[0]*(point + 1) == point[1]*(point + 2) == point[2]

*( i t i) i t[i]

한국대학교 객체지향연구소18

*(point + i) == point[i]

Page 19: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

예제 10-8예제 10 8

한국대학교 객체지향연구소19

Page 20: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

포인터 인자 이용포인터 인자 이용

함수 sumary의 함수헤더 부분을 기술하는헤더 부분을 기술하는다른 방법

call by address 함수의인자로배열이나포인터를이용하는경우, 배열이름이나배열원소의첫번째원소의주소값을첫번째원소의주소값을인자로넘기면됨

함수형식인자에포인터나배열을사용하는방법을

sum = sumaryf(point, 6);//sum = sumaryf(&point[0] 6);

배열을사용하는방법을주소에의한호출(call by address)

//sum = sumaryf(&point[0], 6);

한국대학교 객체지향연구소20

Page 21: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

예제 10-9예제 10 9

한국대학교 객체지향연구소21

Page 22: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

다중 포인터다중 포인터

포인터의 포인터 포인터 변수의 주소 값을 갖는 변수를 포인터의 포인터포인터 변수의 주소 값을 갖는 변수를 포인터의 포인터

이러한 포인터의 포인터를 다중 포인터• 변수 선언에서 *를 여러 번 이용하여 다중 포인터 변수를 선언

int i = 10;int *pi = &i; int **dpi = π

다중 포인터 변수를 이용하여 일반 변수를 참조하려면 역참조연산자를 여러 번 이용연산자를 여러 번 이용

• 즉 위의 변수 dpi를 이용하여 변수 i의 값을 20으로 수정하려면

**dpi = 20;

한국대학교 객체지향연구소22

dpi = 20;

Page 23: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

포인터 배열포인터 배열

의미 포인터 배열이란 주소 값을 저장하는 포인터를 요소로 하는 배열포인터 배열이란 주소 값을 저장하는 포인터를 요소로 하는 배열

선언 포인터 배열은 다음과 같이 선언 int *pAry[3];

int a = 50, b = 30, c = 40;pAr [0] = &apAry[0] = &a; pAry[1] = &c; pAry[2] = &b;

한국대학교 객체지향연구소23

Page 24: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

이차원 배열 이름이차원 배열 이름

이차원 배열에서 배열 이름 tAry는 무엇일까? • 이차원 배열에서 배열이름 tAry는 포인터 상수 tAry[0]를 가리키는• 이차원 배열에서 배열이름 tAry는 포인터 상수 tAry[0]를 가리키는포인터 상수

int tAry[][3] = {{1 20 12} {3 5 16}};

그러면 tAry[0]는 무엇인가?• 포인터 상수 tAry[0]는 배열의 첫 번째 원소 tAry[0][0]의 주소 값

int tAry[][3] = {{1, 20, 12}, {3, 5, 16}};

y[ ] y[ ][ ]&tAry[0][0]을 갖는 포인터 상수

결론적으로 배열이름 tAry는 포인터 상수 tAry[0]의 주소 값을갖는 포인터 상수 그러므로 다음이 성립갖는 포인터 상수, 그러므로 다음이 성립

&tAry[0][0] == tAry[0]tAry[0] == *tAryy[ ] y

한국대학교 객체지향연구소24

Page 25: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

이차원 배열의 구조와 의미이차원 배열의 구조와 의미

다음은 포인터 상수 tAry[0]와 tAry의 모습을 표현• 점선인 그림은 상수를 표현 상수는 저장 장소는 아님• 점선인 그림은 상수를 표현, 상수는 저장 장소는 아님

한국대학교 객체지향연구소25

Page 26: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

이차원 배열 여러 의미이차원 배열 여러 의미

일차원 배열에서 연산자 sizeof (배열명)를 이용하면 배열의 크기(바이트) 연산자 sizeof (배열명)를 이용하면 배열의 크기(바이트)

이차원 배열에서 sizeof 연산을 이용하면

sizeof (tAry) == 24 (이차원 배열의 크기 = 6*4 )sizeof (tAry[0]) == 12 (1행의 크기 = 4*3 )sizeof (tAry[0][0]) == 4 (원소의 형인 int의 크기)

연산 sizeof에서 알 수 있듯이 배열명 tAry는 이차원 배열을 대표하며, tAry[i]는 (i+1)행을 대표

포인터 상수인 tAry[0]와 tAry의 역참조 연산자를 이용하면 다음 식 포인터 상수인 tAry[0]와 tAry의 역참조 연산자를 이용하면 다음 식만족

tAry[0][0] == *tAry[0] == 1tAry[0] == *tAry == 12FF68

포인터 상수인 tAry[0]가 &tAry[0][0]이라면• tAry[1]은 &tAry[1][0], 역참조 연산자를 이용하면 다음 식 만족

tAry[0][0] *tAry[0] 1

한국대학교 객체지향연구소26

tAry[0][0] == *tAry[0] == 1tAry[1][0] == *tAry[1] == 3

Page 27: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

배열 포인터 상수배열 포인터 상수

포인터 상수인 tAry[0]의 연산식 tAry[0] + 1은 무엇을 의미할까?• 연산식 tAry[0] + 1은 &tAry[0][1]을 의미• 연산식 tAry[0] + 1은 &tAry[0][1]을 의미• 즉 연산식 tAry[0] + 1은 포인터 상수 tAry[0]에 다음 정수에 해당하는 주소값을 의미하므로 &tAry[0][1]

&tAry[0][1] (tAry[0] + 1) 12FF6C&tAry[0][1] == (tAry[0] + 1) == 12FF6C&tAry[0][2] == (tAry[1] + 2) == 12FF70tAry[0][1] == *(tAry[0] + 1) == 20tAry[0][2] == *(tAry[1] + 2) == 12

포인터 상수인 tAry의 연산식 tAry + 1은 무엇을 의미할까? • 연산식 tAry + 1은 포인터 tAry가 가르키는 배열 상수의 다음 배열 상수의주소값

y[ ][ ] ( y[ ] )

주소값– 즉 연산식 tAry + 1은 &tAry[1]을 의미

• 연산식 tAry + i은 배열 tAry의 i+1번째 행의 첫 번째 원소의 주소 값이 있는상수를 가리키는 포인터

&tAry[0][0] == tAry[0] == *(tAry) == 12FF68&tAry[1][0] == tAry[1] == *(tAry + 1) == 12FF74tAry[0][0] == *tAry[0] == **(tAry) == 1

한국대학교 객체지향연구소27

tAry[0][0] == *tAry[0] == **(tAry) == 1tAry[1][0] == *tAry[1] == **(tAry + 1) == 3

Page 28: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

이차원 배열 포인터 상수이차원 배열 포인터 상수

배열 이름을 이용한 원소 참조 본 포인터 상수 tAry와 tAry+1 tAry[0] tAry[1]을 배열과 함께 본 포인터 상수 tAry와 tAry+1, tAry[0], tAry[1]을 배열과 함께정리

이차원 배열 이름은 이중 포인터 다중 포인터 변수를 이용하여 일반 변수를 참조하려면 다중 포인터 변수를 이용하여 일반 변수를 참조하려면

• 역참조 연산자를 여러 번 이용 즉 배열 이름인 tAry는 이중 포인터이며,

• 이 tAry를 이용하여 변수 tAry[0][0]의 값을 20으로 수정하려면

**tAry = 20;

한국대학교 객체지향연구소28

Page 29: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

이차원 배열 주소 값 표현이차원 배열 주소 값 표현

이차원 배열에서의 각 원소의 주소 값을 표현하는 여러 방법

int tAry[][3] = {{1 20 12} {3 5 16}};

위 배열 tAry에서 첫 번째 원소인 tAry[0][0]의 주소 값을 표현하는 방법은&tAry[0][0], tAry[0], *tAry 방법

int tAry[][3] = {{1, 20, 12}, {3, 5, 16}};

한국대학교 객체지향연구소29

Page 30: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

원소 tAry[i][j] 표현원소 tAry[i][j] 표현 이차원 배열에서 원소 tAry[i][j]의 저장 값을 표현하는 여러방법방법

*( tAry[i] +j )*( *(tAry + i) + j )*( *tAry + (열의 수)*i + j )

마지막 표현인 (*(tA + i))[j]이 복잡한 구조

*( &tAry[0][0] + (열의 수)*i + j )( *(tAry + i) )[j]

마지막 표현인 (*(tAry + i))[j]이 복잡한 구조• 일차원 배열에서 다음 식이 성립함을 확장한 표현

한국대학교 객체지향연구소30

Page 31: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

2차원 배열 포인터2차원 배열 포인터 다음과 같은 2차원 배열을 저장할 수 있는 배열 포인터(pointer to

array) 변수는 무엇일까? array) 변수는 무엇일까? int ary[][4] = {4, 5, 2, 6, 7, 8, 12, 51, 87, 99, 23, 43};

변수 ptr

배열 포인터는 앞에서 배운 포인터 배열과 그 선언 방법이 매우비슷하여 혼동하기 쉬우니 주의하길 바란다.

int (*ptr) [4]; //배열포인터 : 2차원배열의주소값을저장int *ptr[4]; //포인터배열 :배열원소가포인터인배열

한국대학교 객체지향연구소31

int ptr[4]; //포인터배열 : 배열원소가포인터인배열

Page 32: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

전달의 차이전달의 차이

call by value 함수의 구현에서 인자를 사용하는 방법 중에서 포인터가 아닌 일반

int increment(int number){

함수의 구현에서 인자를 사용하는 방법 중에서 포인터가 아닌 일반변수를 사용하면 값에 의한 전달(call by value) 방식

{number++;return number;

}

실인자로 사용하는 변수에는 영향이 없음 실인자로 사용하는 변수에는 영향이 없음 call by address

함수의 인자로 포인터 변수를 이용하는 방식함수 현 의 장 여 함수 구현 부분의 문장 (*num)++은 ++(*num)으로 하여도같은 기능을 수행

주의 : *num++나 *(num++)로 사용 시 같은 결과를 얻을 수없음

void incrementbyaddress(int *num){

(*num)++;

없음

한국대학교 객체지향연구소32

( num)++;}

Page 33: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

주소에 의한 전달의 이해주소에 의한 전달의 이해

call by address

한국대학교 객체지향연구소33

Page 34: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

함수 포인터함수 포인터

함수 포인터(pointer to function) 변수 함수의주소값을저장하는변수 함수의주소값을저장하는변수

함수 add()

변수 pf 함수포인터

한국대학교 객체지향연구소34

Page 35: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

함수 포인터 배열함수 포인터 배열

의미

포인터를원소로갖는함수포인터배열 포인터를원소로갖는함수포인터배열

배열의크기가 4인함수포인터배열을선언하는문장

배열의각원소가가리키는함수• 반환값이 void이고인자목록이 (double*, double, double) 선언된배열에함수 4개의주소값을저장하는문장 선언된배열에함수 4개의주소값을저장하는문장

배열의선언과초기화문장으로간단히처리

한국대학교 객체지향연구소35

Page 36: 2008 Kang s C 2nd Edition 10 포인터.ppt [호환 모드] - Chosunssjarng.chosun.ac.kr/c/chapter10.pdf · 2017. 5. 29. · 포인터변수는자동으로형변환(cast)이불가능하며필요하면

C로 배우는 프로그래밍 기초 2nd Edition

36