6.2.4 포인터와 배열
1) 포인터와 배열은 서로 호환적
배열과 포인터에는 모두 배열 원소를 명시하는 첨자를 사용할 수 있다. 그러나 포인터 변수는 다른 주소들을 값으로 가질수 있으나, 배열명은 다른 주소값을 가질 수 없다.
int A[] = { 10, 20, 30, 40, 50 };
int *p, i;
A가 배열로 선언되어 있으므로 첨자를 붙이지 않은 A자체는 int형 포인터이고, 그 값은 A[0]의 주소이다. A는 포인터이므로 포인터 연산과 같이 A + i 와 같은 수식이 가능하다. A+i 는 A[i]의 주소인 &A[i] 이다.
*(A +i)는 A[i]가 된다. 포인터도 배열 표기법을 사용할 수 있는데, p[i]는 *(p+i)와 같은 의미이다.
A + i == &A[i];
A[i] == *(A + i);
*(p+i) == p[i];
p가 A배열의 두 번째 원소를 포인트하게 하려면 다음의 두 가지 방식 중 하나를 사용하면 된다.
p = A + 1;
p = &A[1];
포인터와 배열은 호환이 가능하나, 차이점은 포인터 p이는 다른 주소값을 넣을 수 있지만 배열 A에는 다른 값을 넣을 수 없다는 것이다.
p = &i; 는 가능 하나, A = &i;는 불가능하다.
// 포인터와 배열의 호환성 예1
#include <stdio.h>
void main(){
char A[]="CSKNOU";
char *p = A;
int i;
int size = sizeof(A); //배열 A원소 수 계산
for(i=0; i<size-1; i++)
printf("*(A+%d) : %c \n", i, *(A+i));
// 배열을 포인터 형식으로 참조하면 *(배열명+n)은 배열명[n]과 같음
for(i=0; i<size-1; i++)
printf("p[%d] : %c \n", i, p[i]); } // 포인터를 배열 형식으로 참조
2) 배열과 포인터의 값 변경
배열명은 실제적으로 포인터와 같다. 그러나 배열명의 값을 변경하는 것은 불가능하다.
배열 A[i]에서 배열명 A의 값이 A ++ 나 A-- 와 같이 변경될 수 없다는 것이다.
그러나 포인터에서는 그 값을 변셩시킬 수 있다. 즉, p가 포인터라면 p++나 p--와 같이 값이 변경될 수 있다.
3) 배열과 포인터의 기억공간 확보
> 배열 : - 기억공간 중 자료영역을 고정적으로 확보
> 포인터 : - 기억공간 중 자료영역을 유동적으로 확보
* 필요할 때만 자료용 기억 공간을 확보
* 자료의 개수가 가변적인 경우 효과적
>> 포인터가 배열보다 활용의 폭이 넓다. <<
6.2.5 포인터 배열
포인터 배열 => 포인터의 집합
> 포인터가 여러 개 사용될 때 포인터 배열로 선언
> 주로 문자열 배열 처리에 사용
char *name1, *name2, name3;
↓↓↓↓
char *name[3];
** 포인터 배열 선언과 기억공간 표현
char *PA[4];
PA[0] = "ELECTRONIS";
PA[1] = "DATA";
PA[2] = "PROCESSING";
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; //배열 a[]의 시작 주소를 포인터 배열 요소에 전달
PA[1] = b; //배열 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); }
6.2.6 이중 포인터
- pointer to pointer - 형식 int **p; - 자료가 있는 곳을 이중으로 가리키는 포인터 - 이중 포인터가 가리키는 주소로 가보면 자료가 아닌 주소 값이 들어 있고, 그 주소에 자료가 들어 있음 |
int **p;
p : 기억공간 주소
*p : 주소 p에 수록되어 있는 값, 이 값이 주소로 사용된다.
**p : 주소가 *p인 곳에 수록되어 있는 값, 즉 int형 자료이다.
// 이중 포인터의 사용 예
#include <stdio.h>
void main(){
char a = 'A', *p, **pp; // 일반 변수, 포인터 변수, 이중 포인터 변수 선언
p = &a; // 포인터 변수 p에 일반 변수 a의 주소값 할당
pp = &p; // 이중 포인터 변수 pp에 포인터 변수 p의 주소값 할당
printf("**pp = %c", **pp); }
'방송통신대학 > C 프로그래밍' 카테고리의 다른 글
구조체 배열struct array (0) | 2020.06.12 |
---|---|
구조체 struct (0) | 2020.06.11 |
포인터와 배열 char pointer , array (0) | 2020.06.09 |
포인터변수의 선언과 참조 pointer variable Declaration (3) | 2020.06.08 |
배열과 포인터 array, pointer (0) | 2020.06.07 |