목차
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
소개글