Download presentation
Presentation is loading. Please wait.
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;
Similar presentations