Presentation is loading. Please wait.

Presentation is loading. Please wait.

제8장 포인터 문봉근.

Similar presentations


Presentation on theme: "제8장 포인터 문봉근."— Presentation transcript:

1 제8장 포인터 문봉근

2 제8장 포인터 8.1 포인터의 의미 8.2 포인터 연산자 8.3 포인터 산술 연산자 8.4 배열과 포인터 8.5 포인터 배열
8.6 복잡한 포인터 이해하기

3 8.1 포인터의 의미 호출시 복사 반환시 복사 안함

4 포인터의 의미(계속) 정수변수, 실수변수, 문자변수 → 정수, 실수, 문자와 같은 자료를 저장
포인터변수 → 자료가 저장된 공간에 대한 주소를 저장 문법 자료형 *변수이름;

5 예제 8.1 int형과 char형을 지칭하는 포인터 선언.
int *p; char *q;

6 예제 8.2 int형 변수와 int형을 지칭하는 포인터 선언.
int a, b; int *ptr; a = 10; ptr = &a;

7 예제 8.3 변수의 값과 변수의 주소 출력하기 #include <stdio.h>
#include <conio.h> void main(void) { int x; x = 100; printf("value of x = %d\n", x); printf("address of x = %x\n", &x); } 실행결과 value of x = 100 address of x = 12ff7c

8 8.2 포인터 연산자 pt=&a; 변수 a의 주소를 pt에 배정 a=*pt; 포인터 pt가 지칭한 값을 a에 배정

9 예제 8.4 포인터 연산자 사용하기 #include <stdio.h> #include <conio.h>
void main(void) { int x; int *p; x = 100; p = &x; printf("value of *p = %d\n", *p); printf("value of p = %x\n", p); printf("address of p = %x\n", &p); } 실행결과 value of *p = 100 value of p = 12ff7c address of p = 12ff78

10 예제 8.5 변수와 포인터 그리고 이들 사이의 주소 관계
int x; /* statement 1 */ float y; /* statement 2 */ int *p; /* statement 3 */ float *q; /* statement 4 */ x=10; /* statement 5 */ y=0.89; /* statement 6 */ p=&x; /* statement 7 */ q=&y; /* statement 8 */

11 그림 8.2 변수와 포인터와의 관계 int x; float y; int *p; float *q; x 10 x=10;
p=&x; q=&y; x 정수 변수 10 y 0.89 정수 변수 p 포인터 변수 Y의 주소 q 포인터 변수 X의 주소

12 예제 8.6 배열의 시작주소 출력하는 프로그램. #include <stdio.h> void main(void) {        int array[] = {100, 200, 300, 400, 500};        printf("array = %x\n", array);        printf("address of array[0] = %x\n", &array[0]); } 실행결과 array = 12ff6c address of array[0] = 12ff6c

13 8.3 포인터 산술연산자

14 예제 8.7 문자배열의 주소를 이용해서 문자열을 출력하는 프로그램.
#include <stdio.h> #include <string.h> void main(void) { char c[10]; char *p; strcpy(c, "computer"); p = c; printf("%s\n", p); printf("%s\n", p+3); printf("%s\n", p+5); } 실행결과 computer puter ter

15 예제 8.8 정수배열의 내용을 포인터를 이용해서 출력하는 프로그램.
#include <stdio.h> void main(void) {        int array[] = {100, 200, 300, 400, 500};        int *ptr;        ptr = array;        printf("%d\n", *ptr + 5);        printf("%d\n", *(ptr+2) + 5); } 실행결과 105 305

16 예제 8.9 포인터를 이용해서 정수 배열변수에 값을 저장하고 출력하는 프로그램.
#include <stdio.h> void main(void) {        int x[3],*p;        x[1]=5;        p=&x[1];        *(p-1)=3;        *(p+1)=7;        printf("%d  %d  %d\n",*(p-1),*p,*(p+1)); } 실행결과 3 5 7

17 예제 8.10 포인터를 이용해서 정수 계산을 하고 출력하는 프로그램.
#include <stdio.h> void main(void) { int a,b,*p1,*p2; a=10, b=20; p1=&a, p2=&b; *p1=*p1+3,*p2=*p2+3; printf("a+b = %d\n",a+b); } 실행결과 a+b = 36

18 예제 8.11 포인터가 지시하고 있는 메모리 속의 값을 1만큼 증가시켰을 때의 문자와 1만큼 감소시켰을 때의 문자를 각각 출력하는 프로그램.
#include <stdio.h> #include <conio.h> void main(void) {        char x,*p;        x='Y';        p=&x;        printf("Original Character : %c\n",*p);        (*p)++;        printf("+1 Character : %c\n",*p);        (*p)--;        --(*p);        printf("-1 Character : %c\n",*p);        getch(); } 실행결과 Original Character : Y +1 Charater : Z -1 Character : X

19 예제 8.12 임의의 문자열을 입력하고, 역방향으로 출력하는 프로그램
#include <stdio.h> #include <conio.h> #include <string.h> void main(void) { char buffer[80], *p=buffer; int len,i=0; printf("Input String : "); scanf("%s",p); len = strlen(p); while (*p) p++; printf("Inverse String : ");

20 예제 8.12(계속) while (i<len) { p--; putchar(*p); i++; } putchar('\n');
getch(); 실행결과 ***Input String => Turbo-C ***Inverse String => C-obruT

21 8.4 배열과 포인터 int a[10];

22 문자열인 경우 char *S="C-Programming";

23 예제 8.13 배열 arr[3]을 선언하고 arr[0]=5, arr[1]=8, arr[2]=3 일 때 포인터를 사용하여 arr[0]×arr[1]×arr[2]를 구하는 프로그램.
#include <stdio.h> #include <conio.h> void main(void) {        int arr[]={5,8,3};        int s,i,*p;        s=1;        p=&arr[0];        for (i=0;i<3;i++)                printf("arr[%d] = %d \n", i, arr[i]);                s=s**(p+i);        printf("\narr[0]*arr[1]*arr[2] = %d\n",s);        getch(); }

24 예제 8.14 배열 array[5]를 선언하고, array[0]=0,  array[1]=1, array[2]=2를 대입한 포인터를 사용하여 array[1]+array[3]+array[5]+array[7]+array[9]를 구하는 프로그램. #include <stdio.h> #include <conio.h> void main(void) {        int array[]={0,1,2,3,4,5,6,7,8,9};        int w,i,*p;        w=0;        p=&array[0];        for (i=0;i<10;i++)                printf("array[%d] = %d \n",i,array[i]);        for (i=0;i<9;i+=2)                w=w+*(p+i);        printf("\narray[1]+array[3]+array[5]+array[7]+array[9] = %d\n",w);        getch(); }

25 예제 8.15 정수값을 갖는 배열에서 최대값과 최소값을 찾는 프로그램.
#include <stdio.h> #include <conio.h> void main(void) { int Arr[]={34,-67,24,-40,81,-12,13,94,3,20}; int i,*p,max=-1000,min=1000; int maxlocation,minlocation; p=&Arr[0]; printf(" Array[] = {");

26 예제 8.15(계속) for (i=0;i<10;i++) { if (*(p+i)>max) { max=*(p+i); maxlocation=i+1; } if (*(p+i)<min) { min=*(p+i); minlocation=i+1; } printf(" %d ",*(p+i)); } printf("}\n"); printf(" Maximum Value ==> %d , Location ==> %d\n", max, maxlocation); printf(" Minimum Value ==> %d , Location ==> %d\n", min, minlocation); getch();

27 예제 8.16 정수값을 갖는 배열에서 최대값과 최소값을 찾는 프로그램.
#include <stdio.h> #include <conio.h> Change(char *x, char *y) {        char temp;        while(*x)  {                temp=*x;                *x=*y;                *y=temp;                x++;                y++;         }        return(temp); }

28 예제 8.16 (계속) void main(void) { static char a[]="ABCDEF";
       static char        printf("Before Change\n");        printf(" \n");        printf("a[] = %s \n",a);        printf("b[] = %s \n\n",b);        Change(a,b);        printf("After Change\n");        printf("b[] = %s \n",b);        getch(); }

29 예제 8.17 정수값을 갖는 배열에서 최대값과 최소값을 찾는 프로그램.
#include <stdio.h> #include <conio.h> void main(void) {        char arr[]="programming";        char *ptr;        int bigchar;        ptr=arr;        printf(" before : %s \n\n",arr);        printf(" after  : ");        while (*ptr)        {                bigchar=*ptr-32;                printf("%c",bigchar);                ptr++;        }        printf("\n");        getch(); }

30 예제 8.18 정수값을 갖는 배열에서 최대값과 최소값을 찾는 프로그램.
#include <stdio.h> #include <conio.h> void main(void) {        char arr[20];        char *ptr;        int bigchar,smallchar;        printf("\n before  : ");        scanf("%s",arr);        ptr=arr;        

31 예제 8.18 (계속) printf("\n after : "); while (*ptr) {
       {                if ((*ptr>='a')&&(*ptr<='z'))                {                        bigchar=*ptr-32;                        printf("%c",bigchar);                        ptr++;                }                if ((*ptr>='A')&&(*ptr<='Z'))                        smallchar=*ptr+32;                        printf("%c",smallchar);        }        printf("\n");        getch(); }

32 예제 8.19 정수값을 갖는 배열에서 최대값과 최소값을 찾는 프로그램.
#include <stdio.h> #include <conio.h> #include <string.h> void main(void) {        char arrx[20],arry[20];        char *xptr,*yptr;        int i,len;        printf("\n -----  first string : ");        scanf("%s",arrx);        printf("\n second string : ");        scanf("%s",arry);        len=strlen(arrx);        xptr=arrx;        yptr=arry;        printf("\n");        for(i=0;i<len;i++)                if (*(xptr+i) == *(yptr+i))                        printf(" character => %c ,                                location =>  %d\n",*(xptr+i),i+1);        getch(); }

33 8.5 포인터 배열 배열의 각 요소가 포인터를 나타내는 것을 포인터 배열이라 한다. 문법 int *a[3];
자료형 *배열 이름[요소의 갯수]; int *a[3];

34 그림 8.6 포인터 배열과 저장공간과의 관계

35 예제 8.20 일요일을 0으로 하고, 정수 n을 읽어들여 일요일로부터 n일째의 요일을 반환하는 프로그램.
#include <stdio.h> #include <conio.h> #include <stdlib.h> char *DayName(int n) {        static char *Day[] = {                "Sunday",                "Monday",                "Tuesday",                "Wednesday",                "Thursday",                "Friday",                "Saturday"        };        return(Day[n]); }

36 예제 8.20(계속) void main(void) { int n; char *s;
       printf(" 0'th dayname => Sunday\n");        printf(" ---- Enter n value  \n");        printf(" ---- n = ");        scanf("%d",&n);        if (n<0 || n>6) {                printf(" ******************************************\n ");                printf(" Wrong n value!!!   n's Range : 0<=n<=6 \n");                getch();                exit(0);        }        s=DayName(n);        printf(" %d'th dayname => %s\n\n",n,s);        getch(); }

37 예제 8.21 과일이름의 처음 문자를 입력하면 전체 과일이 름이 나올 수 있도록 switch문을 사용하여 프로그램
#include <stdio.h> #include <conio.h> char *fruit(char s) { switch(s) { case 'a':return("apple"); case 'b':return("banana"); case 'o':return("orange"); case 's':return("strawberry"); case 'g':return("grape"); case 'p':return("pineapple"); case 't':return("tomato"); default :return("Fruit name is not exist!!!"); }

38 예제 8.21(계속) void main(void) { char str[5];
printf(" input first one character => "); while (*gets(str) != 'Q') { printf(" *** fruit = %s \n\n", fruit(*str)); } getch();

39 예제 8.22 자동차 메이커와 자동차 이름을 각각 포인터 배열로 선언해 놓고, 메이커에 해당하는 문자열을 입력받은 뒤, 그에 해당하는 자동차 이름을 출력하는 프로그램.
#include <stdio.h> #include <conio.h> #include <string.h> char *maker(int n) {        static char *makerName[] = {                        "KIA",                        "HYUNDAI",                        "DAEWOO",                        "SSANGYUNG"                        };        return(makerName[n]); } char *car(int m)        static char *carName[] = {                        "pride",                        "sonata",                        "espero",                        "korando"        return(carName[m]);

40 예제 8.22(계속) void main(void) { char str[20]; int k=0;
       printf(" maker    => ");        scanf("%s",str);        while (maker(k))  {                if (!strcmp(str,maker(k)))  {                        printf(" car name => %s \n\n",car(k));                        break;                }                k++;        }        getch(); }

41 8.6 복잡한 포인터 이해하기 1. 변수의 이름은 ptr이다. 2. ptr은 포인터변수이다.

42 8.6 복잡한 포인터 이해하기(계속) 20 ptr 주소값 : 10 배열 원소의 타입은 정수

43 예제 8.23 정수를 가리키는 크기가 10인 1차원 포인터배열
int *p[10]

44 예제 8.24 포인터의 포인터 선언 int **p p 1000 100 1 int형 값 주소값

45 8.7 함수 포인터 문법 반환자료형 (*포인터변수이름) (인수 리스트);

46 예제 8.26 int sum(int a, int b) { …중략 } int diff(int c, int d)
{ …중략 } int diff(int c, int d) int (*fptr) (int, int); void main(void) fptr = sum; i = fptr(2,3); fptr = diff; i = fptr(2,3); …중략

47 예제 8.27 함수포인터를 이용한 간단한 예 #include <stdio.h> void main(void) {
int (*func_ptr) (const char *, ...); func_ptr = printf; func_ptr ("Hello world \n"); }

48 예제 8.27(계속) 1, func_ptr은 변수이다. 2. func_ptr은 포인터 변수이다.
3. 포인터는 함수를 가리킨다. 4. 함수의 결과 값은 정수이다. 5. 함수의 인수로써 첫 번째는 문자포인터이고 다음은 임의의 인수들이다.

49 예제 8.28 함수포인터를 이용해서 sin()함수와 cos()함수 이용하기
#include <stdio.h> #include <math.h> double sigma (double (*trig_func) (double), double dLower, double dUpper); void main(void) {        double dSum;        dSum = sigma(sin, 0.1, 1.0);        printf(" The sum of the sine from 0.1 to 1.0 is %lf\n", dSum);        dSum = sigma(cos, 0.5, 3.0);        printf(" The sum of the cosine from 0.5 to 3.0 is %lf\n", dSum); } double sigma(double (*trig_func)(double), double dLower, double dUpper)        double dCount, dTotal = 0.0;        for(dCount=dLower; dCount<=dUpper; dCount+=0.1)                dTotal = dTotal + trig_func(dCount);        return dTotal;


Download ppt "제8장 포인터 문봉근."

Similar presentations


Ads by Google