카테고리 없음

10강 배열과 포인트 3

meta-tony 2023. 4. 12. 22:19

1. char형 포인터
char포인터
-포인터는 문자열 처리에 효과적
-문자열 처리에 char형 포인터 사용

char 포인터의 기억공간 표현
char * cp = "COMPUTER";
문자열 첫글자 *cp 순서대로 + 1~8...
-cp는 문자열의 시작주소를 갖는다
-따라서 값읊 참조할 때와는 달리 포인터변수 cp에 주소를 치환하지 않는다.
//char 포인터의 사용 예
#include <stdio.h>
void main()
{
char* cp = "COMPUTER";
int i = 0;
do
printf("*(cp + %d): %c\n", i, *(cp + i));
while (*(cp + i++) != 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):
*/


2. 포인터와 배열의 관계
포인터를 이용한 1차원 배열의 참조
char s[] = "SCIENCE";
char *cp;
cp = s; // 포인터 cp를 이용하여 배열 s의 내용을 참조
-배열은 포인터의 일부분
-모든 배열은 포인터로 표현 가능
cp + 1 <-> &sp[1]
*(cp + 1) <-> s[1]
// 포인터를 이용한 1차원 배열의 참조 예
#include <stdio.h>
void main() {
static int a[] = { 10, 20, 30, 40, 50 };
int* pt, b, c, d;
pt = a; // 배열명을 사용하여 배열의 시작주소를 할당
b = *pt + *(pt + 3); // b = 10 + 40
pt++; // 포인터를 1 이동
c = *pt + *(pt + 3); // c = 20 + 50
d = *pt + 3; // d = 20 + 3
printf("b = %d, c = %d, d = %d", b, c, d);
}
/*b = 50, c = 70, d = 23*/

포인터를 이용한 2차원 배열의 참조
int a[2][3];
int *pt
pt = a;
a[0]은 첫번째 행, a[1] = *(pt + 1)은 두번쨰 행 표시 
a: 배열 a[2][3]의 시작 주소

// 포인터를 이용한 2차원 배열의 참조 예
#include <stdio.h>
void main() {
static a[3][3] = { {1,2,3},{4,5,6},{7,8,-9} };
int* pt;
pt = a[0];
while (*pt != -9) {
printf("%d", *pt);
pt++;
}
}/* 12345678 */

포인터와 배열의 관계
-포인터와 배열은 서로 호환적
int A[] = {10, 20, 30, 40, 50};
int *p, i;

A+i == &A[i]
A[i] == *(A+i)
*(p+i) == p[i]

//포인터와 배열의 호환 예(상호적)
#include <stdio.h>
void main()
{
char A[] = "ARPAY";
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 + 0): A
*(A + 1): R
*(A + 2): P
*(A + 3): A
*(A + 4): Y
p[0]: P
p[1]: O
p[2]: I
p[3]: N
p[4]: T
p[5]: E
p[6]: R
*/

포인터와 배열의 값 변경
-배열 A[i]에서 A++, A--와 같이 값 변경이 불가
-포인터 *p에서 p++, p--와 같이 값 변경 가능

배열과 포인터의 기억공간 확보
-배열: 기억공간 중 자료영역을 고정적으로 확보
-포인터: 기억공간 중 자료영역을 유동적으로 확보
,필요할 때만 자료용 기억 공간을 확보, 자료의 개수가 가변적인 경우 효과적

포인터가 배열보다 활용이 폭이 넓다.


3. 포인터 배열
포인터 배열 => 포인터의 집합
-포인터가 여러 개 사용될 때 포인터 배열로 선언
-주로 문자열 배열 처리에 사용
char * name1, *name2, *name3;
=> char * name[3];

포인터 배열 선언과 기억공간 표현
char * PA[0] ="ELECTRONICS";
char * PA[1] ="DATA:;
char * PA[2] ="PROCESSING";
char * PA[3] ="SYSTEM";
-2차원 배열과 동일
-2차원 배열에 비해 기억공간 절약효과
(포인터배열은 자료의 크기만큼 기억공간 할당)
// 포인터 배열의 사용 예
#include <stdio.h>
void main(){
int a[] = { 1,2,3,4 };
int b[] = { 5,6,7,8 };
int* PA[2];
PA[0] = a;
PA[1] = b;
printf("*(PA[0]) = %d\n", *(PA[0]));
printf("*(PA[0] + 1) = %d\n", *(PA[0] + 1));
printf("PA[1] = %d\n", *PA[1]);
printf("*PA[1] + 15 = %d\n", * PA[1] + 15);
}
/*
*(PA[0]) = 1
*(PA[0] + 1) = 2
PA[1] = 5
*PA[1] + 15 = 20
*/



4. 이중 포인터
Point to pointer
-자료가 있는 곳을 이중으로 가리키는 포인터
-이중 포인터가 가리키는 주소로 가보면 자료가 아닌 주소 값이 들어 있고 그 주소에 자료가 들어있음
이중 포인터의 선언 => int **p;
- p 기억공간 주소
-*p 주소 p에 수록되어 있는 값. 이 값이 주소로 사용됨
- **p 주소가 *p인 곳에 수록되어 있는 값. 즉 int형 자료
//이중 포인터의 사용 예
#include <stdio.h>
void main() {
char a = 'A', * p, ** pp; // 이중 포인터변수 선언
p = &a; // 포인터변수에 일반변수 a의 주소 할당
pp = &p; // 이중 포인터변수에 포인터변수 p의 주소 값 할당
printf("**pp=%c", **pp);
}
// **pp=A