PowerPoint 프레젠테이션

Download Report

Transcript PowerPoint 프레젠테이션

제8장 포인터
문봉근
YES C 제 8 장 포인터
1/49
제8장 포인터
8.1 포인터의 의미
8.2 포인터 연산자
8.3 포인터 산술 연산자
8.4 배열과 포인터
8.5 포인터 배열
8.6 복잡한 포인터 이해하기
YES C 제 8 장 포인터
2/49
8.1 포인터의 의미
호출시 복사
반환시 복사 안함
YES C 제 8 장 포인터
3/49
포인터의 의미(계속)
• 정수변수, 실수변수, 문자변수 → 정수, 실
수, 문자와 같은 자료를 저장
• 포인터변수 → 자료가 저장된 공간에 대한
주소를 저장
• 문법
– 자료형 *변수이름;
YES C 제 8 장 포인터
4/49
예제 8.1 int형과 char형을 지칭하는 포인터 선언.
int *p;
char *q;
YES C 제 8 장 포인터
5/49
예제 8.2 int형 변수와 int형을 지칭하는 포인터 선언.
int a, b;
int *ptr;
a = 10;
ptr = &a;
YES C 제 8 장 포인터
6/49
예제 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
YES C 제 8 장 포인터
7/49
8.2 포인터 연산자
pt=&a; 변수 a의 주소를 pt에 배정
a=*pt; 포인터 pt가 지칭한 값을 a에 배정
YES C 제 8 장 포인터
8/49
예제 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
YES C 제 8 장 포인터
9/49
예제 8.5 변수와 포인터 그리고 이들 사이의 주소 관계
int x;
float y;
int *p;
float *q;
x=10;
y=0.89;
p=&x;
q=&y;
YES C 제 8 장 포인터
/*
/*
/*
/*
statement
statement
statement
statement
1
2
3
4
*/
*/
*/
*/
/* statement 5 */
/* statement 6 */
/* statement 7 */
/* statement 8 */
10/49
그림 8.2 변수와 포인터와의 관계
int x;
float y;
int *p;
float *q;
x=10;
y=0.89;
p=&x;
q=&y;
YES C 제 8 장 포인터
정수 변수
x
정수 변수
y 0.89
10
포인터 변수
p
Y의 주소
포인터 변수
q
X의 주소
11/49
예제 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
YES C 제 8 장 포인터
12/49
8.3 포인터 산술연산자
YES C 제 8 장 포인터
13/49
예제 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
YES C 제 8 장 포인터
14/49
예제 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
YES C 제 8 장 포인터
15/49
예제 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
YES C 제 8 장 포인터
16/49
예제 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
YES C 제 8 장 포인터
17/49
예제 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
YES C 제 8 장 포인터
18/49
예제 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 : ");
YES C 제 8 장 포인터
19/49
예제 8.12(계속)
while (i<len) {
p--;
putchar(*p);
i++;
}
putchar('\n');
getch();
}
실행결과
***Input
String => Turbo-C
***Inverse String => C-obruT
YES C 제 8 장 포인터
20/49
8.4 배열과 포인터
int a[10];
YES C 제 8 장 포인터
21/49
문자열인 경우
char *S="C-Programming";
YES C 제 8 장 포인터
22/49
예제 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]);
for (i=0;i<3;i++)
s=s**(p+i);
printf("\narr[0]*arr[1]*arr[2] = %d\n",s);
getch();
}
YES C 제 8 장 포인터
23/49
예제 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();
}
YES C 제 8 장 포인터
24/49
예제 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[] = {");
YES C 제 8 장 포인터
25/49
예제 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();
YES C 제 8 장 포인터
26/49
예제 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);
}
YES C 제 8 장 포인터
27/49
예제 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("-------------------------\n");
printf("a[] = %s \n",a);
printf("b[] = %s \n",b);
getch();
}
YES C 제 8 장 포인터
28/49
예제 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();
}
YES C 제 8 장 포인터
29/49
예제 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;
YES C 제 8 장 포인터
30/49
예제 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);
ptr++;
}
}
printf("\n");
getch();
}
YES C 제 8 장 포인터
31/49
예제 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();
}
YES C 제 8 장 포인터
32/49
8.5 포인터 배열
• 배열의 각 요소가 포인터를 나타내는 것을
포인터 배열이라 한다.
• 문법
– 자료형 *배열 이름[요소의 갯수];
• int *a[3];
YES C 제 8 장 포인터
33/49
그림 8.6 포인터 배열과 저장공간과의 관계
YES C 제 8 장 포인터
34/49
예제 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]);
}
YES C 제 8 장 포인터
35/49
예제 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");
printf(" ******************************************\n ");
getch();
exit(0);
}
s=DayName(n);
printf(" %d'th dayname => %s\n\n",n,s);
getch();
}
YES C 제 8 장 포인터
36/49
예제 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!!!");
}
}
YES C 제 8 장 포인터
37/49
예제 8.21(계속)
void main(void)
{
char str[5];
printf(" input first one character => ");
}
while (*gets(str) != 'Q') {
printf(" *** fruit = %s \n\n",
fruit(*str));
printf(" input first one character =>
");
}
getch();
YES C 제 8 장 포인터
38/49
예제 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]);
}
YES C 제 8 장 포인터
39/49
예제 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();
}
YES C 제 8 장 포인터
40/49
8.6 복잡한 포인터 이해하기
1.
2.
3.
4.
변수의 이름은 ptr이다.
ptr은 포인터변수이다.
ptr은 포인터의 포인터변수이다.
ptr은 10*20 크기의 2차원 배열을 가리키는 포인터의 포
인터변수이다.
5. ptr은 10*20 크기의 2차원 정수배열을 가리키는 포인터
의 포인터변수이다.
YES C 제 8 장 포인터
41/49
8.6 복잡한 포인터 이해하기(계속)
20
ptr
10
주소값
주소값
:
:
…
…
: … :
…
:
배열 원소의 타입은 정수
YES C 제 8 장 포인터
42/49
예제 8.23 정수를 가리키는 크기가 10인 1차원 포인터배열
int *p[10]
YES C 제 8 장 포인터
43/49
예제 8.24 포인터의 포인터 선언
int **p
p
100
1000
주소값
YES C 제 8 장 포인터
1
주소값
int형 값
44/49
8.7 함수 포인터
• 문법
– 반환자료형 (*포인터변수이름) (인수 리스트);
YES C 제 8 장 포인터
45/49
예제 8.26
int sum(int a, int b)
{ …중략
}
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);
…중략
}
YES C 제 8 장 포인터
46/49
예제 8.27 함수포인터를 이용한 간단한 예
#include <stdio.h>
void main(void)
{
int (*func_ptr) (const char *, ...);
func_ptr = printf;
func_ptr ("Hello world \n");
}
YES C 제 8 장 포인터
47/49
예제 8.27(계속)
1,
2.
3.
4.
5.
func_ptr은 변수이다.
func_ptr은 포인터 변수이다.
포인터는 함수를 가리킨다.
함수의 결과 값은 정수이다.
함수의 인수로써 첫 번째는 문자포인터이고 다음은 임의
의 인수들이다.
YES C 제 8 장 포인터
48/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;
}
YES C 제 8 장 포인터
49/49