Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 10 Pointer Applications.

Similar presentations


Presentation on theme: "Chapter 10 Pointer Applications."— Presentation transcript:

1 Chapter 10 Pointer Applications

2 배열과 동적 메모리 할당 배열: 배열이름이 포인터 상수임
동적 메모리 할당: 필요한 메모리를 할당받고, 다 쓴 메모리는 반납함.

3 배열이름은 포인터 상수 배열 이름은 포인터 상수이다. 따라서 값이 바뀔 수 없다. 배열의 첫 번째 요소를 가리킨다.
다차원 배열에 대해서도 이미 설명함 배열 이름 자체가 간접참조에 사용될 수 있다. a  &a[0] 포인터가 배열의 어떤 요소를 가리킨다면 배열이름 대신에 사용할 수 있다.

4 Figure 10-1

5 Figure 10-2

6 Figure 10-3

7 Figure 10-4

8 포인터 계산과 배열 포인터 계산을 이용하여 배열에 접근할 수 있다.
포인터 p가 있을 때, p+n은 p를 기준으로 n 요소 떨어진 값을 가리키는 포인터 다음 페이지 그림 참조 주소 = 포인터 + (오프셋*요소의 크기) a+n  a+n*(sizeof(one element)) 포인터 연산과 값 접근 *(a+n)  a[n]  p=a+n; *p p+5, 5+p, p1-p2, p++, --p

9 Figure 10-5

10 Figure 10-6

11 Figure 10-7

12 Figure 10-8

13 포인터를 이용한 배열 출력 int main (void) {
int ary[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int *pWalk; int *pEnd; /* Statements */ /* Print array forward */ printf("Array forward : "); for (pWalk = ary, pEnd = ary + MAX_SIZE; pWalk < pEnd; pWalk++) printf ("%3d", *pWalk); printf ("\n"); /* Print array backward */ printf("Array backward: "); for (pWalk = pEnd - 1; pWalk >= ary; pWalk--) return 0; } /* main */

14 포인터를 이용한 binary search int binarySearch (int list[], int *endPtr, int target, int **locnPtr) { /* Local Definitions */ int *firstPtr; int *midPtr; int *lastPtr; /* Statements */ firstPtr = list; lastPtr = endPtr; while (firstPtr <= lastPtr) midPtr = firstPtr + (lastPtr - firstPtr) / 2; if (target > *midPtr) /* look in upper half */ firstPtr = midPtr + 1; else if (target < *midPtr) /* look in lower half */ lastPtr = midPtr - 1; else /* found equal: force exit */ firstPtr = lastPtr + 1; } /* end while */ *locnPtr = midPtr; return (target == *midPtr); } /* binarySearch */

15 다차원 배열에서 포인터 연산 2차원 배열 int table[5][10] table[5]  table + 5

16 Figure 10-9

17 함수로 배열 전달 배열 이름을 그냥 넘겨주면 됨 받을 때는 배열이나 포인터로 받으면 됨 다차원
doIt(anyName) 받을 때는 배열이나 포인터로 받으면 됨 int doIt(int ary[]) int doIt(int *arySalary) 다차원 float doIt(int bigAry[][12][5] 다차원을 일차원으로 또는 그 역으로도 가능 float doIt(int bigAry[240])  float doIt(int *bigAry) float doIt(int anySalary[5][6])

18 Figure 10-10

19 기타 선언 다음의 오른쪽 왼쪽 규칙을 볼 것 int * aryOfptrs[5] int (*ptrToAry) [5]

20 Figure 10-11

21 Figure 10-2

22 메모리 할당 함수 필요한 메모리의 양이 가변적이거나 프로그램 중간에 필요 없는 메모리를 반납하여 다른 목적에서 쓸 수 있게 함
정적 메모리 할당 동적 메모리 할당 메모리 할당 방법에 따라 성능에 큰 차이가 나므로 조심해야 함 메모리 할당 함수 malloc, calloc, realloc, free

23 메모리 사용 메모리 사용 프로그램을 기억하는 메모리
스택(stack): 함수가 불릴 때마다 지역변수의 기억장소를 할당(auto[matic]) 전역변수, static 변수 등 기억: 주로 heap사용 힙(heap): 메모리할당 함수에 의해 사용

24 Figure 10-13

25 Figure 10-14

26 Figure 10-15

27 malloc malloc void *malloc(size_t size);
size_t는 <stdio.h>에 있으며 주로 unsigned int형임 pInt = (int *) malloc (sizeof(int)); 크기는 이식성이 높도록 되도록 ‘sizeof’로 계산할 것 형변환을 요구하지 않지만 형변환을 하는 것이 좋음 malloc에 의해 할당된 메모리는 포인터로만 접근 가능 (자체 식별자가 없음) 메모리가 충분하지 않으면 NULL을 돌려줌

28 Figure 10-16

29 인접할당(calloc) 배열 할당에 주로 사용
특정크기의 배열을 담을 수 있을 만큼 충분히 큰 메모리를 할당(두 개의 parameter 사용) 첫 번째 요소의 위치를 돌려줌 할당한 메모리의 값을 0으로 초기화 조심: 문자일 때 ‘NULL’ 값이 아니다. void *calloc(size_t element-count, size_t element-size)

30 Figure 10-17

31 메모리재할당( realloc) 비효율적일 수 있으므로 사용에 주의
이전 메모리 끝부분의 메모리를 제거하여 확장 또는 새로운 메모리에 이동하여 확장 따라서 이전 메모리의 위치를 절대위치로 받아서 사용하는 포인터는 위치를 조정하지 않으면 다른 메모리를 가리킬 수 있음 void *realloc(void *ptr, size_t newSize);

32 Figure 10-18

33 메모리 해제(free) 할당한 메모리를 더 이상 사용할 필요가 없을 때 사용 void free(void *ptr);
혹시 다른 변수가 아직 사용함에도 free하면 dangling 발생 어떤 메모리를 모든 접근할 수 변수가 다른 메모리를 가리키게 되면 garbage 발생

34 Figure 10-19

35 포인터 배열 다양한 크기의 배열이 다수 필요할 때 사용 다음 슬라이드 참고 table+1과 같은 연산은 불가능하다!!!!!!

36 Figure 10-20

37 Figure 10-21

38 Figure 10-22

39 Figure 10-23

40 포인터를 이용한 정렬 스트링 정렬(추후 설명) 원래 자료는 그대로 두고 정렬은 따로
이런 것과 비슷한 개념이 inverted file임

41 Figure 10-25

42 Figure 10-26

43 10장 실습 및 11장 예습 10장 38, 39, 44, 49 51 (집에서 해 와도 됨) ---- 해결한 사람에게 10점 추가로 부여 11장 11, 12, 16, 19, 24


Download ppt "Chapter 10 Pointer Applications."

Similar presentations


Ads by Google