목차
6.1 포인터의 개념
6.2 포인터 식
6.3 배열과 포인터
6.4 문자열 상수 포인터
6.5 포인터 배열
6.2 포인터 식
6.3 배열과 포인터
6.4 문자열 상수 포인터
6.5 포인터 배열
본문내용
값으로 비교.
6.5 포인터 배열
다른 자료형처럼 포인터를 배열로 사용할 수 있다.
예. int *pa[20]; /* 20개의 원소를 갖는 정수형 포인터 배열 - 배열의 내용이 포인터 */
int myvar;
pa[8] = &myvar;
*pa[8] = 100;
예제. char *p[] = {
"Input exceeds field width",
"Out of range",
"Printer not turned on",
"Paper out",
"Disk full",
"Disk write error"
};
error(int err_num)
{
printf("%s\n", p[err_num]);
}
6.6 다중 간접 참조
포인터가 다른 포인터를 가리키는 것(pointer to pointer)
--
-------
--
-------
포인터에 대한 포인터
포인터
변수
포인터에 대한 포인터의 선언:
예. char **mp;
예:
char **mp, *p, ch;
p = &ch; /* ch의 주소를 얻는다. */
mp = &p; /* p의 주소를 얻는다. */
**mp = 'A'; /* 다중 간접 참조를 통하여 ch에 'A'를 치환한다. */
** 다중 간접 참조에 대한 깊이는 제한이 없으나 너무 많으면 추적하기 어렵다.
예제. #include "stdio.h"
main()
{
float *fp, **mfp, val;
fp = &val;
mfp = &fp;
**mfp = 123.903; /* val = 123.903; */
printf("%f, %f\n", val, **mfp);
}
예제. #include "stdio.h"
main()
{
char *p, **mp, str[80];
p = str;
mp = &p;
printf("Enter your name : ");
gets(*mp);
printf("Hi %s\n", *mp);
}
6.7 포인터 매개변수
포인터를 함수에 전달하면, 함수 내의 코드는 포인터를 전달받은 매개변수를 통하여
호출시의 변수를 직접 접근할 수 있다.
** 호출할 때의 변수 이름과 호출되는 함수의 매개변수 이름은 달라도 된다.
예.
int i = 5 ;
sample(&i) ;
:
sample(int *p)
{
*p = 10 ;
}
** 포인터를 전달받는 매개변수는 포인터와 같은 형의 포인터로 선언되어야만 한다.
예제. #include "stdio.h"
main()
{
myputs("This is a test.");
}
myputs(char *p)
{
while (*p) { /* p의 내용(*p)이 NULL이 아닌 동안 반복 */
printf("%c", *p); /* *p++ */
p++;
}
printf("\n");
}
예제. #include "stdio.h"
main()
{
char str[80];
mystrcopy(str, "This is a test");
printf("%s\n", str);
}
mystrcopy(char *to, char *from)
{
while (*from) /* from의 내용(*from)이 NULL이 아닌 동안 반복 */
*to++ = *from++; /* *to=*from; to++; from++; */
*to = '\0'; /* 문자열의 끝을 나타내는 널 문자를 넣는다. */
}
비교.
1) Call by value
#include "stdio.h"
main()
{
int a=10, b=20;
printf("Before : %d, %d\n", a, b);
swap(a, b);
printf("After : %d, %d\n", a, b);
}
swap(int p, int q)
{
int temp;
temp = p;
p = q;
q = temp;
printf("In swap : %d, %d\n", p, q);
}
2). Call by reference
#include "stdio.h"
main()
{
int a=10, b=20;
printf("Before : %d, %d\n", a, b);
swap(&a, &b);
printf("After : %d, %d\n", a, b);
}
swap(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
printf("In swap : %d, %d\n", *p, *q);
}
프로그래밍 연습
6.1절 연습문제 4.
6.3절 연습문제 3.
6.4절 연습문제 1
6.5절 연습문제 1
6.7절 연습문제 1, 2
종합문제 1-5
종합문제 2-2
6.5 포인터 배열
다른 자료형처럼 포인터를 배열로 사용할 수 있다.
예. int *pa[20]; /* 20개의 원소를 갖는 정수형 포인터 배열 - 배열의 내용이 포인터 */
int myvar;
pa[8] = &myvar;
*pa[8] = 100;
예제. char *p[] = {
"Input exceeds field width",
"Out of range",
"Printer not turned on",
"Paper out",
"Disk full",
"Disk write error"
};
error(int err_num)
{
printf("%s\n", p[err_num]);
}
6.6 다중 간접 참조
포인터가 다른 포인터를 가리키는 것(pointer to pointer)
--
-------
--
-------
포인터에 대한 포인터
포인터
변수
포인터에 대한 포인터의 선언:
예. char **mp;
예:
char **mp, *p, ch;
p = &ch; /* ch의 주소를 얻는다. */
mp = &p; /* p의 주소를 얻는다. */
**mp = 'A'; /* 다중 간접 참조를 통하여 ch에 'A'를 치환한다. */
** 다중 간접 참조에 대한 깊이는 제한이 없으나 너무 많으면 추적하기 어렵다.
예제. #include "stdio.h"
main()
{
float *fp, **mfp, val;
fp = &val;
mfp = &fp;
**mfp = 123.903; /* val = 123.903; */
printf("%f, %f\n", val, **mfp);
}
예제. #include "stdio.h"
main()
{
char *p, **mp, str[80];
p = str;
mp = &p;
printf("Enter your name : ");
gets(*mp);
printf("Hi %s\n", *mp);
}
6.7 포인터 매개변수
포인터를 함수에 전달하면, 함수 내의 코드는 포인터를 전달받은 매개변수를 통하여
호출시의 변수를 직접 접근할 수 있다.
** 호출할 때의 변수 이름과 호출되는 함수의 매개변수 이름은 달라도 된다.
예.
int i = 5 ;
sample(&i) ;
:
sample(int *p)
{
*p = 10 ;
}
** 포인터를 전달받는 매개변수는 포인터와 같은 형의 포인터로 선언되어야만 한다.
예제. #include "stdio.h"
main()
{
myputs("This is a test.");
}
myputs(char *p)
{
while (*p) { /* p의 내용(*p)이 NULL이 아닌 동안 반복 */
printf("%c", *p); /* *p++ */
p++;
}
printf("\n");
}
예제. #include "stdio.h"
main()
{
char str[80];
mystrcopy(str, "This is a test");
printf("%s\n", str);
}
mystrcopy(char *to, char *from)
{
while (*from) /* from의 내용(*from)이 NULL이 아닌 동안 반복 */
*to++ = *from++; /* *to=*from; to++; from++; */
*to = '\0'; /* 문자열의 끝을 나타내는 널 문자를 넣는다. */
}
비교.
1) Call by value
#include "stdio.h"
main()
{
int a=10, b=20;
printf("Before : %d, %d\n", a, b);
swap(a, b);
printf("After : %d, %d\n", a, b);
}
swap(int p, int q)
{
int temp;
temp = p;
p = q;
q = temp;
printf("In swap : %d, %d\n", p, q);
}
2). Call by reference
#include "stdio.h"
main()
{
int a=10, b=20;
printf("Before : %d, %d\n", a, b);
swap(&a, &b);
printf("After : %d, %d\n", a, b);
}
swap(int *p, int *q)
{
int temp;
temp = *p;
*p = *q;
*q = temp;
printf("In swap : %d, %d\n", *p, *q);
}
프로그래밍 연습
6.1절 연습문제 4.
6.3절 연습문제 3.
6.4절 연습문제 1
6.5절 연습문제 1
6.7절 연습문제 1, 2
종합문제 1-5
종합문제 2-2