Presentation is loading. Please wait.

Presentation is loading. Please wait.

제 9 장 포인터.

Similar presentations


Presentation on theme: "제 9 장 포인터."— Presentation transcript:

1 제 9 장 포인터

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

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

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

5 변수와 메모리 변수의 크기에 따라서 차지하는 메모리 공간이 달라진다. char형 변수: 1바이트, int형 변수: 4바이트,…

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

7 변수의 주소 i의 주소: c의 주소: f의 주소:

8 포인터의 선언 포인터: 변수의 주소를 가지고 있는 변수

9 다양한 포인터의 선언

10 간접 참조 연산자 간접 참조 연산자 *: 포인터가 가리키는 값을 가져오는 연산자

11 간접 참조 연산자의 해석 간접 참조 연산자: 지정된 위치에서 포인터의 타입에 따라 값을 읽어 들인다.

12 포인터 예제 #1 i = 3000 &i = p = *p = 3000

13 포인터 예제 #2 p = *p = 10 p = *p = 20

14 포인터 예제 #3 i = 10 i = 20

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

16 포인터 사용시 주의점 #1 초기화가 안된 포인터를 사용하면 안된다.

17 포인터 사용시 주의점 #2 포인터가 아무것도 가리키고 있지 않는 경우에는 NULL로 초기화
포인터의 유효성 여부 판단이 쉽다.

18 포인터 사용시 주의점 #3 포인터의 타입과 변수의 타입은 일치하여야 한다.

19 포인터를 증가시키면 가리키는 대상의 크기만큼 증가합니다.
포인터 연산 가능한 연산: 증가, 감소, 덧셈, 뺄셈 연산 증가 연산의 경우 증가되는 값은 포인터가 가리키는 객체의 크기 포인터를 증가시키면 가리키는 대상의 크기만큼 증가합니다. 포인터 타입 ++연산후 증가되는값 char 1 short 2 int 4 float double 8

20 증가 연산 예제 증가 전 pc = 10000, pi = 10000, pd = 10000 증가 후 pc = 10001, pi = 10004, pd = 10008 pc+2 = 10003, pi+2 = 10012, pd+2 = 10024

21 포인터의 증감 연산

22 간접 참조 연산자와 증감 연산자 수식 의미 v = *p++ p가 가리키는 값을 v에 대입한 후에 p를 증가한다.

23 간접 참조 연산자와 증감 연산자 i = 10, pi = 0012FF60 i = 11, pi = 0012FF60

24 중간 점검 포인터에 대하여 적용할 수 있는 연산에는 어떤 것들이 있는가?
int형 포인터 p가 80번지를 가리키고 있었다면 (p+1)은 몇 번지를 가리키는가? p가 포인터라고 하면 *p++와 (*p)++의 차이점은 무엇인가? p가 포인터라고 하면 *(p+3)의 의미는 무엇인가? * 연산자, ++, --, +, - 연산자 84 번지를 가리킨다. *p++ : p가 가리키는 값을 사용한 후에 p를 증가 (*p)++ : p가 가리키는 값을 증가 p가 가리키는 곳에서 3번째에 있는 객체

25 포인터와 배열 &a[0] = &a[1] = &a[2] = a =

26 포인터와 배열

27 포인터와 배열 a = a + 1 = *a = 10 *(a+1) = 20

28 포인터와 배열

29 포인터를 배열처럼 사용

30 포인터를 배열처럼 사용 a[0]=10 a[1]=20 a[2]=30 p[0]=10 p[1]=20 p[2]=30

31 포인터를 배열처럼 사용

32 중간 점검 배열의 첫 번째 원소의 주소를 계산하는 2가지 방법을 설명하라. 배열 a[]에서 *a의 의미는 무엇인가?
배열의 이름에 다른 변수의 주소를 대입할 수 있는가? 포인터를 이용하여 배열의 원소들을 참조할 수 있는가? 포인터를 배열의 이름처럼 사용할 수 있는가? (1) A (2) &A[0] 첫번째 원소의 값 대입할 수 없다. 배열의 이름은 포인터 상수라고 생각하면 된다. 즉 변경이 불가능하다. 참조할 수 있다. 사용할 수 있다. p[0], p[1] ,.. 등의 표현이 가능하다.

33 함수 호출시 인수 전달 방법 값에 의한 호출(call-by-value) 참조에 의한 호출(call-by-reference)
인수의 값만이 함수로 복사된다. 복사본이 전달된다고 생각하면 된다. 참조에 의한 호출(call-by-reference) C에서는 포인터를 이용하여 흉내낼 수 있다. 인수의 주소가 함수로 복사된다. 원본이 전달된다고 생각하면 된다.

34 값에 의한 호출

35 참조에 의한 호출

36 swap() 함수 #1 변수 2개의 값을 바꾸는 작업을 함수로 작성 a=100 b=200 변경되지 않음!! Why?

37 swap() 함수 #1 값들이 복사되었고 원본 변수에는 아무런 영향이 없다.

38 swap() 함수 #2 포인터를 이용 변경되었음!! a=100 b=200 a=200 b=100

39 swap() 함수 #2

40 2개 이상의 결과를 반환 기울기와 y-절편을 인수로 전달

41 2개 이상의 결과를 반환 기울기는 , y절편은

42 배열이 함수 인수인 경우 일반 변수 vs 배열 참조에 의한 호출 값에 의한 호출

43 배열이 함수 인수인 경우 배열의 원본을 함수로 전달하는 이유: 크기가 큰 배열을 복사하려면 많은 CPU 시간 소모
따라서 배열의 경우, 배열의 주소를 전달하여서 원본을 직접 전달한다.

44 예제

45 예제

46 함수가 포인터를 반환하는 경우 함수는 포인터도 반환할 수 있다. 함수가 종료되더라도 남아 있는 변수의 주소를 반환하여야 한다.
지역 변수의 주소를 반환하면 , 함수가 종료되면 사라지기 때문에 오류 지역 변수 result는 함수가 종료되면 소멸되므로 그 주소를 반환하면 안된다.!!

47 포인터 사용의 장점 연결 리스트나 이진 트리 등의 향상된 자료 구조를 만들 수 있다. 참조에 의한 호출 동적 메모리 할당
14장에서 간단하게 학습 참조에 의한 호출 포인터를 매개 변수로 이용하여 함수 외부의 변수의 값을 변경할 수 있다. 동적 메모리 할당 14장에서 학습

48 중간 점검 함수에 매개 변수로 변수의 복사본이 전달되는 것을 ____________라고 한다.
함수에 매개 변수로 변수의 원본이 전달되는 것을 ____________라고 한다. 배열을 함수의 매개 변수로 지정하는 경우, 배열의 복사가 일어나는가? 값에 의한 호출(call by value) 참조에 의한 호출(call by reference) 배열은 복사되지 않고 원본이 전달된다.

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

50 함수 포인터

51 fp1.c

52 fp1.c 10+20은 30 10-20은 -10

53 중간 점검 double 형 매개 변수를 가지며 double형의 값을 반환하는 함수 포인터 pf를 선언하여 보자.
double (*pf) (doube);

54 Q & A


Download ppt "제 9 장 포인터."

Similar presentations


Ads by Google