반응형
SMALL

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);  }

 

 

 

반응형
LIST

+ Recent posts