제8장 포인터 문봉근
제8장 포인터 8.1 포인터의 의미 8.2 포인터 연산자 8.3 포인터 산술 연산자 8.4 배열과 포인터 8.5 포인터 배열 8.6 복잡한 포인터 이해하기
8.1 포인터의 의미 호출시 복사 반환시 복사 안함
포인터의 의미(계속) 정수변수, 실수변수, 문자변수 → 정수, 실수, 문자와 같은 자료를 저장 포인터변수 → 자료가 저장된 공간에 대한 주소를 저장 문법 자료형 *변수이름;
예제 8.1 int형과 char형을 지칭하는 포인터 선언. int *p; char *q;
예제 8.2 int형 변수와 int형을 지칭하는 포인터 선언. int a, b; int *ptr; a = 10; ptr = &a;
예제 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.2 포인터 연산자 pt=&a; 변수 a의 주소를 pt에 배정 a=*pt; 포인터 pt가 지칭한 값을 a에 배정
예제 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
예제 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 */
그림 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의 주소
예제 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
8.3 포인터 산술연산자
예제 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
예제 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
예제 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
예제 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
예제 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
예제 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 : ");
예제 8.12(계속) while (i<len) { p--; putchar(*p); i++; } putchar('\n'); getch(); 실행결과 ***Input String => Turbo-C ***Inverse String => C-obruT
8.4 배열과 포인터 int a[10];
문자열인 경우 char *S="C-Programming";
예제 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(); }
예제 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(); }
예제 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[] = {");
예제 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();
예제 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); }
예제 8.16 (계속) void main(void) { static char a[]="ABCDEF"; static char b[]="!@#$%*"; 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(); }
예제 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(); }
예제 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;
예제 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(); }
예제 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(); }
8.5 포인터 배열 배열의 각 요소가 포인터를 나타내는 것을 포인터 배열이라 한다. 문법 int *a[3]; 자료형 *배열 이름[요소의 갯수]; int *a[3];
그림 8.6 포인터 배열과 저장공간과의 관계
예제 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]); }
예제 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(); }
예제 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!!!"); }
예제 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();
예제 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]);
예제 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(); }
8.6 복잡한 포인터 이해하기 1. 변수의 이름은 ptr이다. 2. ptr은 포인터변수이다.
8.6 복잡한 포인터 이해하기(계속) 20 ptr 주소값 … : 10 배열 원소의 타입은 정수
예제 8.23 정수를 가리키는 크기가 10인 1차원 포인터배열 int *p[10]
예제 8.24 포인터의 포인터 선언 int **p p 1000 100 1 int형 값 주소값
8.7 함수 포인터 문법 반환자료형 (*포인터변수이름) (인수 리스트);
예제 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); …중략
예제 8.27 함수포인터를 이용한 간단한 예 #include <stdio.h> void main(void) { int (*func_ptr) (const char *, ...); func_ptr = printf; func_ptr ("Hello world \n"); }
예제 8.27(계속) 1, func_ptr은 변수이다. 2. func_ptr은 포인터 변수이다. 3. 포인터는 함수를 가리킨다. 4. 함수의 결과 값은 정수이다. 5. 함수의 인수로써 첫 번째는 문자포인터이고 다음은 임의의 인수들이다.
예제 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;