1 / 24

CHAPTER 10 . 포인터

CHAPTER 10 . 포인터. 포인터의 기본 개념과 특징을 이해한다 . 포인터 선언과 간접 참조를 통한 포인터 사용 방법을 배운다 . 포인터의 증감 연산을 통한 다양한 포인터 활용법을 배운다 . 포인터와 배열의 연관성을 배운다 . 함수의 인수 전달에서 포인터의 역할 및 사용 방법을 배운다 . 포인터를 이용한 문자열 처리에 대해 배운다. 10.1.1 주기억장치의 주소 p.450. 주소 부여 단위 설치된 운영체제에 의해 결정되는데 대부분은 1 바이트마다 부여 그림 10 - 2

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. 포인터 포인터의 기본 개념과 특징을 이해한다. 포인터 선언과 간접 참조를 통한 포인터 사용 방법을 배운다. 포인터의 증감 연산을 통한 다양한 포인터 활용법을 배운다. 포인터와 배열의 연관성을 배운다. 함수의 인수 전달에서 포인터의 역할 및 사용 방법을 배운다. 포인터를 이용한 문자열 처리에 대해 배운다.

  2. 10.1.1 주기억장치의 주소 p.450 • 주소 부여 단위 설치된 운영체제에 의해 결정되는데 대부분은 1바이트마다 부여 • 그림 10-2 2GB 주기억장치에 char ch = ‘A’;로 선언된 변수 ch에 할당된 기억장소 • 용량이 2GB라면 주소의 범위는? 1G(Giga) =230 →2G(Giga) =2*230 → 0~ 2* 230 -1번지를 사용 주소 주기억장치 ch

  3. 10.0 개요 p.448 • 일반 변수 프로그램에서 사용하는 데이터를 저장 • 포인터 변수 데이터가 저장된 주기억장치의 주소만 저장 (간단히 포인터(pointer)라고도 함) • 포인터의 장점 • 직접 참조할 수 없는 변수를 포인터를 이용 간접적으로 참조 가능 • 기억 공간의 효율적 사용 • 프로그램 성능 개선

  4. 10.1.3 포인터 훑어보기 프로그램 p.452 • 포인터 사용 3단계(필요한 내용) p.452 ① 포인터 변수 선언 ② 포인터 변수가 특정 기억장소를 가리키기  가리키고 싶은 기억장소의 주소를 포인터 변수에 대입 ③ 포인터를 사용한 간접 참조  특별 연산자인 간접연산자 ‘*’를 이용 주소 주기억장치 variable pointer

  5. 10-1 포인터 변수 ptr을 이용해 var을 참조하는 예 p.452 3 intmain() 4 { 5 intvar = 100; 6 int*ptr; // int형 값 가리킬 포인터 변수 ptr선언 7 8 ptr= &var; // ptr이 변수 var을 가리키게 함 9

  6. 10-1 포인터 변수 ptr을 이용해 var을 참조하는 예 p.452 11 printf("변수 var의 값: %d \n", var); 12 14 printf("var의 간접 참조 (*ptr) 결과 값: %d \n\n", *ptr); 15 17 printf("변수 var의 주소:%u(%p) \n", &var, &var); 18 printf("변수 ptr에 저장된 주소:%u(%p) \n", ptr, ptr); 19 20 return 0; 21 }

  7. 10.2.1 포인터 변수 선언 p.455 • 포인터 변수의 선언 자료형 *포인터변수명; • ㈜ • int* ptr1, ptr2; → ptr1만 포인터 변수 • int*ptr1, *ptr2; → 둘 다 포인터 변수 char *p ‘Y’ 포인터변수가 가리키는 곳에 저장될 자료형 int *pi 나중에 포인터가 가리키는 곳에 자료가 저장된 경우의 그림 1024

  8. 10.2.2 주소 연산자 &와 주소 대입 p.457 • 변수의 주소 구하기 &변수명 • 주소의 대입 포인터변수가 해당 주소의 기억장소를 가리키게 됨 포인터변수명= &변수명; 주소 연산자 (scanf에서사용) 포인터 변수가 오른쪽의 변수를 가리키게 됨 포인터변수 변수명

  9. 10.2.2 주소 연산자 &와 주소 대입 p.457 주소 주기억장치 • 예 1 intvar; 2 int *ptr; 3 4 ptr = &var; 4행 결과의축약 그림 var ptr

  10. 10.2.2 주소 연산자 &와 주소 대입 p.457 • 주의 • int*ptr = &var;의미 • 주소 출력 변환 명세 p.458 • %u: 10진수로 출력, %p: 16진수로 출력 • 예 • printf("변수 var의 주소: %u (16진수: %p) \n", &var, &var); → 변수 var의 주소: 1310588 (16진수: 0013FF7C) • printf("포인터 변수 ptr의 주소: %u (16진수: %p) \n", &ptr, &ptr); → 포인터 변수 ptr의 주소: 1310576 (16진수: 0013FF70) • int *ptr; • ptr = &var; • int *ptr; • *ptr = &var;

  11. 10.2.3 간접 연산자 * p.458 • [그림 10-8] 일반 변수의 직접 참조 p.459 1 var = 100; 2 printf("변수 var에 저장된 값: %d", var); • [그림 10-9] 포인터 변수의 직접 참조 1 intvar = 100; 2 int *ptr; 3 4 ptr = &var; 5 printf("포인터 변수 ptr의 주소:%u \n", ptr); Q) ptr이 가리키는 기억장소(var)를 변수명var을 사용하지 않고 참조하려면? →간접 참조 연산자 *를 사용해야 함 변수 var 100 주소:1310588번지 ptr = &var 결과 • 포인터 변수 ptr 변수 var 1310588 100 주소:1310588번지

  12. 10.2.3 간접 연산자 * p.459 • 포인터를 통한 간접 참조 * 포인터변수명 • 포인터변수에 저장된 주소에 해당하는 기억장소를 참조 → 포인터를 통해 다른 기억장소를 간접적으로 참조 • 쉽게 ‘포인터 변수가 가리키는 곳’으로 해석 • 선언문 int *ptr; 의 의미→ ptr이 가리키는 곳(*ptr)에는 int형 자료가 저장됨을 의미 • 예 1 intvar = 100; 2 int *ptr; 3 4 ptr = &var; 5 printf("ptr이 가리키는 곳에 저장된 값:%d \n", *ptr); • 포인터 변수 ptr 변수 var 1310588 100 주소:1310588번지

  13. 변수의 l-value와 r-value p.460 • 일반 변수의 l-value와 r-value intsum= 0; sum = sum + 1; 변수의 r-value 변수(기억장소)에 저장된 값 그림 10-11 변수의 두 가지 의미: 기억장소와 저장된 값 변수의 l-value 변수의기억장소 주소 주기억장치 0 변수 sum에 저장된 값 변수 sum에 할당된 기억장소

  14. 변수의 l-value와 r-value p.461 • 포인터 변수의 l-value와 r-value • intsum= 0; • int*ptr = ∑ • *ptr = *ptr + 1; • printf(“ptr이 가리키는 곳에 저장된 값: %d", *ptr); 주소 주기억장치 ptr 0

  15. 10.2.5 변수간의 교환과 포인터 간의 교환 비교 p.462 • 두 변수의 값교환 방법 두 가지 → 어느 쪽이 효율적일까? 100 200 a b p1 &a p2 &b

  16. 10-2 두 포인터 변수가 가리키는 곳의 값을 교환하기 p.463 3 intmain() 4 { 5 inta = 100, b = 200, temp; 6 int *p1, *p2, *p_temp; 7 8 p1 = &a; 9 p2 = &b; 12 13 printf("\n>> p1과 p2가 가리키는 곳에 저장된 값을 직접 바꾸기 \n"); 14 temp = *p1; 15 *p1 = *p2; 16 *p2 = temp; 17 18 printf(" a = %d, b = %d\n", a, b); 19 printf("*p1 = %d, *p2 = %d\n", *p1, *p2); 100 p1 a p2 200 b temp

  17. 10-2 두 포인터 변수가 가리키는 곳의 값을 교환하기 p.463 21 printf("\n>> 포인터 p1과 p2에 저장된 주소를 바꾸기 \n"); 22 a = 100, b = 200; 23 p_temp= p1; 24 p1 = p2; 25 p2 = p_temp; 26 27 printf(" a = %d, b = %d\n", a, b); 28 printf("*p1 = %d, *p2 = %d\n", *p1, *p2); 29 30 return 0; 31 } p_temp 100 p1 1310588 a • Q) 어느 쪽이 효율적일까? p2 1310576 200 b

  18. 10.3 포인터의 덧셈과 뺄셈 p.465 • 주소는 4바이트의 정수형 상수 → 포인터에 대한 덧셈과 뺄셈이 가능 ㈜ 곱셈과 나눗셈은 불가능, 실수와의 연산은 불가능 • 포인터 + 1 실제로 1이 아니라 포인터 변수 선언 시 명시한 자료형의기억장소 크기만큼 더한다.

  19. 10-3 ‘포인터 변수+1’과 ‘포인터 변수-1’의 결과 p.465 6 intvi = 123, *pi; 10 pi = &vi; 12 14 printf("\n pi-1 = %u, pi = %u, pi+1 = %u", pi-1, pi, pi+1); 주소 주기억장치 포인터 변수 pi 1310564 123 14행의 pi + 1 pi에 저장된 값 1310564 int형의 크기 4 1310568

  20. 10-4 포인터 개념을 확인하기 위한 프로그램 p.467 5 inta = 100, b = 200; 6 int*p1, *p2; 7 8 p1 = &a; 9 printf("p1 = &a 후: a = %d, *p1 = %d \n", a, *p1); 10 11 *p1 = *p1 + 1; 12 printf("(*p1)++ 후: a = %d, *p1 = %d \n", a, *p1);

  21. 10-4 포인터 개념을 확인하기 위한 프로그램p.467 14 p2 = p1; // p2도 p1이 가리키는 곳을 가리키게 함 15 printf("p2 = p1 후: a = %d, *p1 = %d, *p2 = %d \n", a, *p1, *p2); 16 17 (*p2)++; // *p2 = *p2 + 1; p2가 가리키는 곳의 값을 1 증가 18 printf("(*p2)++ 후: a = %d, *p1 = %d \n\n", a, *p1); 19 20 printf("&a = %u, &b = %u, b = %d \n", &a, &b, b); 21 printf("p1 = %u, p1-1 = %u, *(p1-3) = %d \n", p1, p1-1, *(p1-3)); 책 내용 확인하기 ㈜ ‘debug’ 모드가아닌‘release’ 모드로 실행하면 변수가 차지하는 기억장소 위치가 다르므로 다른 값이 나온다. 실행 과정 동안 변수와 포인터 변수의 변화 내용을 그림으로 그리기

  22. 10.4 포인터와 배열은 친구 p.469 • 포인터의 가감 연산은 어디에서 사용될까? • 배열 원소 참조 ‘배열명[첨자]’ 컴파일러에 의해 ‘*(배열명+첨자)’ 포인터 연산으로 처리됨 • 그림 10-15 주소 주기억장치 배열원소참조 arr 배열명은 배열의 시작 주소값 arr[0], *(arr+0) arr[1], *(arr+1) arr[2], *(arr+2) arr[3], *(arr+3) arr[4], *(arr+4) 1 2 *( arr + 1 ) 3 4 5 둘 다 같은 기억장소를 의미

  23. 10-5 [프로그램 7-1]의 수정 p.471 1 #include <stdio.h> 2 #include <conio.h> // getch함수를 위한 헤더 파일 3 #define SIZE 5 4 5 intmain() 6 { 7 intquiz[SIZE]; 8 inti, count, sum; 9 double ave; 10 11 printf("%d명의 점수를 순서대로 입력하세요.\n\n", SIZE); 12 for (i=0; i<SIZE; i++) 13 { 14 printf("%d번의 퀴즈 점수는? ", i+1); 15 scanf("%d", (quiz + i)); // scanf("%d", &quiz[i]); 16 } 17 18 sum = 0; 19 for (i=0; i<SIZE; i++) 20 sum = sum + *(quiz+i); // sum = sum + quiz[i]; 21 22 ave= (double)sum / SIZE;

  24. 10-5 [프로그램 7-1]의 수정 p.471 23 24 count = 0; 25 for (i=0; i<SIZE; i++) 26 if (*(quiz+i) < ave) // if (quiz[i] < ave) 27 count++; 28 29 printf("\n결과를 보려면 아무키나 누르세요. \n"); 30 getch(); // 키보드로부터 문자 한 개 입력. 일시 정지 효과 31 32 printf("\n===============\n"); 33 printf("평균: %.1lf점 \n", ave); 34 printf("평균 미만: %d명 \n", count); 35 printf("===============\n"); 36 37 return 0; 38 } p.472~p.475 생략

More Related