본문 바로가기
프로그래밍/자료구조

[C언어와 함께 자료구조를] 변수와 포인터

by 헬맷쓰다 2015. 3. 9.
반응형

여러가지 자료구조 모델에 대해 공부하기 전에 3~4회에 걸쳐서 

변수와 포인터, 배열 및 문자열 그리고 구조체, 동적기억 할당에 대해서 

공부해 보도록 합시다.

   

변수와 포인터

   변수와 포인터를 정확히 알려면 메모리 모델을 살펴봐야 합니다.

여기서는 개념적인 면이 없지 않고, C언어에 국한되기는 하지만 이해하기에 무리는 없다고 생각합니다.

[그림1]은 0부터 번호가 부여된 크기가 같은 셀로 구성된 커다란 배열로 볼 수 있습니다. 각 셀은 하나의 문자를 저장할 공간을 가지며, 번호는 배열의 인덱스로 셀의 주소라고 할 수 있습니다.

   

   하나의 셀에는 하나의 char변수를 저장할 수 있으므로, 주소 i번째 저장된 변수는 i번째 주소로로 확인 할 수가 있습니다.

   만약에 셀보다 큰 용량의 변수를 지정한다면, 연속된 메모리 셀에 저장됩니다. 예를 들어 네개의 셀이 필요한 변수를 j번째 주소에 저장한다면  j, j+1, j+2, j+3에 하나의 변수를 저장하게 됩니다. 즉, 4바이트 int 변수라면 주소는 연속된 셀의 첫번째 주소인 j가 됩니다. 보통 변수는 주소와 타입, 두요소로 정의 하며, 변수의 타입으로부터 얼마나 많은 연속된 셀을 차지하는지와 그 셀의 내용 (문자, 정수, 부동소숫점 등등)을 알 수 있습니다.

   이런 연속된 메모리 모델은 자체적으로 배열인데요, 그렇다면 배열 변수를 자연스럽게 다음과 같이 표현할 수 있습니다.

변수타입 x[n];   

   이는 변수타입의 n개의 변수를 가지는 배열 x[]를 생성하며, 각 변수들은 연속된 메모리에 위치하게 됩니다. n이 3이고 변수타입이 int인경우는 다음과 같이 [그림2]와 같이 표현하며,

int x[3];

과 같이 선언할 수 있습니다.

   x[i]의 주소는 x[]의 기본주소인 k에 변수타입인 int의 크기 4에 i를 곱한 수를 더한 값이 됩니다.

x[i]의 주소 = k + 4*i

   

포인터

  포인터 변수는 메모리 셀의 주소를 저장합니다. 다시 말하면 포인터는 메모리에 저장된 변수를 가리키는 주소입니다. 예로, 정수형 변수(int)를 가리키는 포인터 변수 p는 다음과 같이 선언합니다.

int *p;

여기서 p는 변수 p가 가리키는 주소를 나타내며, p가 가리키는 메모리의 내용은 *p가 됩니다.

만약에 p가 x의 주소를 가리키게 하려면 p = &x; 와 같이 주소연산자 "&"를 사용하면 됩니다.

잘 이해가 안되시면  예제를 잠깐 볼까요? 

main ()

{
    int x;
    int *p;

    p = &x;
    x = 1;
    *p = 2;

    printf ("%d ", x);
}

   

1. 정수형 변수 x를 선언했네요.
2. 정수형 변수를 가리키는 포인터 p를 선언했습니다.
3. 포인터 p에 변수 x의 주소를 넣었네요.
4. 변수 x에 1을 넣었습니다.
5. 포인터 p의 내용으로 2를 넣었습니다.

   

따라서, 여기서 출력되는 값은 2가 됩니다.

   

조금 어려웠나요? 다음시간에는 포인터를 이용한 값의 교환/입력에 관한 내용을 알아볼께요.

반응형

댓글