1 / 43

Chapter 10

Chapter 10. Pointer Applications. 배열 : 배열이름이 포인터 상수임 동적 메모리 할당 : 필요한 메모리를 할당받고 , 다 쓴 메모리는 반납함. 배열과 동적 메모리 할당. 배열 이름은 포인터 상수이다 . 따라서 값이 바뀔 수 없다 . 배열의 첫 번째 요소를 가리킨다 . 다차원 배열에 대해서도 이미 설명함 배열 이름 자체가 간접참조에 사용될 수 있다 . a  &a[0] 포인터가 배열의 어떤 요소를 가리킨다면 배열이름 대신에 사용할 수 있다. 배열이름은 포인터 상수.

Download Presentation

Chapter 10

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

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--) printf ("%3d", *pWalk); printf ("\n"); return 0; } /* main */ 포인터를 이용한 배열 출력

  14. 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 */ 포인터를 이용한 binary search

  15. 2차원 배열 int table[5][10] table[5]  table + 5 table[5][3]  *(*(table + 5) + 3) table[0][0]  *(*(table))  *(*(table+0)+0) 다차원 배열에서 포인터 연산

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

  28. Figure 10-16

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

  30. Figure 10-17

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

  32. Figure 10-18

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

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

More Related