2010. 7. 10. 02:09
제 21장 포인터와 배열의 이해! 함께 이해하기 - 1



※ 배열과 포인터의 상관관계를 이해하는 시간을 가져볼까요~


배열의 이름의 정체

 - 배열의 이름 : 첫번째 요소의 주소값을 나타낸다.
                       (0번째 인덱스의 주소값)
 
  ex) &A[0] : "A배열의 0번째 요소의 주소값을 반환하라."

 - "포인터 == 주소값 + 자료형 ( 아주 중요 )"

 - 배열이름도 포인터다. 배열이름 ==>> (상수)포인터

 - 배열이름 : 주소값 + 자료형



배열 이름의 타입

 - 배열이름도 포인터이므로 타입이 존재
 
 - 배열 이름이 가리키는 배열요소에 의해 결정

   ex) int arr1[10] => int*
        double arr2[20] => double*


※ 자, 지금내용부터는 매우 중요하기에 차근차근 읽고 실습해 보자구요


배열 이름의 활용(배열이름도 포인터다, 다만 배열이름은 상수이다)

 - 배열 이름을 포인터처럼, 포인터를 배열 이름처럼 활용하는것이 가능



예제)=============================================================   

#include <stdio.h>

int main()
{
int a[5] = {1, 2, 3, 4, 5}; // 요소개수가 5개인 배열 a를 선언 및 초기화
int* p;                          // 포인터 p를 선언

p = a; // a배열의 이름은 a[0]의 주소값이기때문에 &를 붙일이유가 없다.
         // p라는 포인터가 a를 가리킨다

 
printf("%d %d %d %d %d \n", p[0], p[1], p[2], p[3], p[4]);
printf("%d %d %d %d %d \n", a[0], a[1], a[2], a[3], a[4]);

p = &b;  // 가르키는 값을 변경가능
printf("%d \n", *p);

return 0;
}

 
// a라는 (배열)상수 포인터는 무조건 a[0]만 가리킬수 있어서, 변경불가능
// p는 일반포인터이기 때문에 변경가능함

=================================================================   



 

포인터 연산 : 포인터가 지니는 값을 증가 혹인 감소시키는 연산을 의미한다.
                       ; 포인터가 가리키는 대상의 자료형에 따라서 증가및 감소되는 값이 차이를 지닌다.

ex) ptr++;
    ptr +=3;
    --ptr1;
    ptr2 = ptr1 + 2;

예제)=============================================================   

 
#include <stdio.h>

int main(void)
{
int* ptr1 = 0; // 0번지가 아니고 NULL 포인트 즉, 아무것도 가리키고 있지 않다.
char* ptr2 = 0; // 참고) 별로 좋지 않은 선언이다.
double* ptr3 = 0;

printf("%d번지, %d번지, %d번지 \n", ptr1++, ptr2++, ptr3++);
printf("%d번지, %d번지, %d번지 \n", ptr1, ptr2, ptr3);

return 0;
}

// int형은 4바이트, 4만큼 증가
// char형은 1바이트, 1만큼 증가
// double형은 8바이트, 8만큼 증가

// 그 포인트가 자료형의 따라서 그 증가값이 증가한다.

 

예제)=============================================================   

#include <stdio.h>

int main()
{
int arr[5] = {1, 2, 3, 4, 5};

int* Arr_P = arr;                 // 현재 Arr_P는 a[0]를 가리킴

printf("%d \n", *Arr_P);      // Arr_P가 가리키는 값출력 : 1

printf("%d \n", *(++Arr_P)); // Arr_P의 주속값 4바이트 증가, 그 요소값 출력 : 2
printf("%d \n", *(++Arr_P)); // Arr_P의 주속값 4바이트 증가, 그 요소값 출력 : 3

printf("%d \n", *(Arr_P+1)); // Arr_P의 주속값 4바이트 증가, 그 요소값 출력 : 4
printf("%d \n", *(Arr_P+2)); // Arr_P의 주속값 8(2*4)바이트 증가, 그 요소값 출력 : 5

return 0;
}

그림참고 )

 

// 최종적으로 지금 Arr_P가 가리키는 상태는 3을 가리키고 있다.

Posted by 토실토실천재