배열과 포인터 - 3
char형 포인터, 포인터와 배열의 상관관계, 포인터 배열, 이중 포인터.
- 학습 목표
- char형 포인터를 이용하여 문자열 다루기.
- 포인터를 배열 형식으로, 배열을 포인터 형식으로 참조하기.
- 포인터 배열 사용.
- 이중 포인터에 대한 이해.
주요 용어
- char형 포인터 : 문자열 처리에 효과적인 포인터.
- 포인터 배열 : 포인터가 여러 개 사용될 때 포인터를 배열형식으로 사용.
- 이중 포인터 : 자료가 있는 곳을 이중으로 가리키는 포인터.
char형 포인터
- 포인터는 문자열 처리에 효과적임.
- 문자열 처리에 char형 포인터 사용하면 효율성이 극대화 됨.
char *cp = "COMPUTER";
char 포인터의 기억공간 표현과 예
#include <stdio.h>
int main()
{
// char형 포인터 변수 cp의 값은 COMPUTER가 수록된 시작주소.
char *cp = "COMPUTER";
int i = 0;
do
{
printf("*(cp + %d) : %c\n", i, *(cp + i));
} while (*(cp + i++) != 0); // *(cp + i)를 구한 후 1 증가.
return 0;
}
/**
* *(cp + 0) : C
* *(cp + 1) : O
* *(cp + 2) : M
* *(cp + 3) : P
* *(cp + 4) : U
* *(cp + 5) : T
* *(cp + 6) : E
* *(cp + 7) : R
* *(cp + 8) :
*/
포인터와 배열의 관계
포인터를 이용한 1차원 배열의 참조와 예.
#include <stdio.h>
void main()
{
static int a[] = {10, 20, 30, 40, 50};
int *pt, b, c, d;
// 배열명을 사용하여 배열의 시작주소를 할당 -> a[0]
pt = a;
// a[0] + a[3] = 10 + 40 = 50
b = *pt + *(pt + 3);
// 포인터를 1 이동 a[1]
pt++;
// a[1] + a[4] = 20 + 50 = 70
c = *pt + *(pt + 3);
// a[1] + 3 = 23
d = *pt + 3;
printf("b = %d, c = %d, d = %d\n", b, c, d);
// b = 50, c = 70, d = 23
}
포인터를 이용한 2차원 배열의 참조와 예.
#include <stdio.h>
void main()
{
static a[3][3] = {
{1, 2, 3}
, {4, 5, 6}
, {7, 8, -9}
};
int *pt;
// pt = a 또는 pa = &a[0][0]과 동일
pt = a[0];
while (*pt != -9)
{
printf("%d ", *pt);
pt++;
}
}
포인터와 배열은 상호 호환적.
int A[] = {1, 2, 3, 4, 5};
int *p, i;
// -->>
A + i == &A[i];
A[i] == *(A + i);
*( p + i ) == p[i];
#include <stdio.h>
void main()
{
char A[] = "ARRAY";
char *p = "POINTER";
int i;
for (i = 0; i < 5; i++)
{
// 배열을 포인터 형식으로 참조.
printf("*(A + %d) : %c\n", i, *(A + i));
}
for (i = 0; i < 7; i++)
{
// 포인터를 배열 형식으로 참조.
printf("p[%d] : %c\n", i, p[i]);
}
}
포인터와 배열의 관계
- 포인터와 배열의 값 변경
- 배열 : A[i]에서 A++, A--로 값 변경 불가.
- 포인터 : *p에서 p++, p--로 값 변경 가능.
- 배열과 포인터의 기억공간 확보
- 배열
- 기억공간 중 자료여역을 고정적으로 확보.
- 포인터
- 기억공간 중 자료영역을 유동적으로 확보.
- 필요할 때만 자료용 기억 공간을 확보.
- 자료의 개수가 가변적인 경우 효과적.
- 기억공간 중 자료영역을 유동적으로 확보.
- 포인터가 배열보다 활용의 폭이 넓다.
- 배열
포인터 배열
포인터 배열 -> 포인터의 집합.
- 포인터가 여러 개 사용될 때 포인터 배열로 선언.
- 주로 문자열 배열 처리에 사용.
char *str1, *str2, *str3;
->char *strs[3];
포인터 배열 선언과 기억공간 표현
포인터 배열 사용 예
#include <stdio.h>
void main()
{
int a[] = {1, 2, 3, 4};
int b[] = {5, 6, 7, 8};
// 포인터 배열의 선언.
int *PA[2];
// 배열 a[]의 시작주소를 포인터 배열요소에 전달.
PA[0] = a;
// 배열 b[]의 시작주소를 포인터 배열요소에 전달.
PA[1] = b;
printf("*(PA[0]) = %d\n", *(PA[0])); // 1
printf("*(PA[0] + 1) = %d\n", *(PA[0] + 1)); // 2
printf("*PA[1] = %d\n", *PA[1]); // 5
printf("*PA[1] + 15 = %d\n", *PA[1] + 15); // 20
}
이중 포인터 (Pointer to pointer)
자료가 있는 곳을 이중으로 가리키는 포인터.
이중 포인터가 가리키는 주소에 데이터가 아닌 주소 값이 들어 있음.
이중 포인터의 선언
- 형식 : int **p;
- 의미 : 포인터 변수에 다시 포인터를 지정하는 것으로, 포인터에 대한 포인터.
- P : 기억공간 주소.
- *P : 주소 P에 수록되어 있는 값. 이 값이 주소로 사용 됨.
- **P : 주소가 *P인 곳에 수록되어 있는 int형 데이터 값.
#include <stdio.h>
void main()
{
char a = 'A', *p, **pp;
// 포인터 변수에 일반변수 a의 주소 할당.
p = &a;
// 이중 포인터변수에 포인터변수 p의 주소 할당.
pp = &p;
printf("**pp = %c", **pp);
}
'Language > C' 카테고리의 다른 글
[C] 구조체와 공용체 - 2 (0) | 2021.01.01 |
---|---|
[C] 구조체와 공용체 -1 (0) | 2020.12.27 |
[C] 배열과 포인터 - 2 (0) | 2020.12.27 |
[C] 배열과 포인터 - 1 (0) | 2020.12.25 |
[C] 함수와 기억 클래스 - 2 (0) | 2020.12.25 |