sonumb

C Pointer - 1 본문

개발자 이야기/C/C++

C Pointer - 1

sonumb 2008. 2. 8. 05:38
요즘 시중에 나와있는 포인터 책들을 자세히는 보지 못했으나 책 두께가 그렇게 된다는 것은 조금 오버이지 않나 생각이 든다. 너무 어렵게 생각하는 경향이 있는 거 같다.  :p

크게 나눠서 일반적인 변수에 대한 포인터, 함수에 대한 포인터 정도로 나눠본다.
첫째로 일반적인 변수에 대한 포인터에 대한 개념은 아주 단순하다.
대상의 주소와 포인터 연산시 메모리 번지수를 얼마 만큼 더해야하는가에 대한 표기.
더이상 어려울것도 없다.  :-)
아래 예제를 보자.

#include <stdio.h>

int main( void )
{
    int arr[20][30][40];
    int (*p)[30][40];

    int i,j,k;     ; 배열 인덱스
    long x=0;   ; 값대입.

    for( i=0; i<20 ; i++)
     for( j=0; j<30 ; j++)
      for( k=0; k<40 ; k++)
       arr[i][j][k] = x++;
    p = arr;

    //p[1][2][3] == 1*30*40 + 2*40 + 3 == 1283
    printf(
      "p's addr : %ld, p+1 : %ld\n"
      "p[1][2][3] : %ld\n",
       p, (p+1), p[1][2][3]
      );

    return 0;
}

int (*p)[30][40];[각주:1] 
이부분을 보자. 이것은 3차원 배열을 가르키기 위한 포인터이다.

(*p)는 가리키는 대상의 주소를 저장하는 것이고,
int ... [30][40]은 메모리를 얼마만큼 (pointer+number)일경우 ,
기존주소에 얼마만큼 더할 것인가에 대한 표기이다.
여기서는 sizeof(int)*40*30 = 4800 이 되겠다.
그러면 포인터 연산시 원래 주소에 4800이 더해진 주소가 억세스 될 것이다.
출력:
p's addr : 1149028, p+1 : 1153828
p[1][2][3] : 1283
직접 위 소스를 이리 저리 뜯어 고쳐 보길 바란다.
특히, *p , *p+1 의 주소도 비교해보고.
**p , **p+1 의 주소도 비교해보길 바란다.
  1. 배열 주소 계산법은 Fundamentals of Data Structures in C 책의 Array 부분을 참고 하시길. [본문으로]
반응형