관리 메뉴

IT 컴퓨터공학 자료실

초급편 4. 주소 가져오기 본문

컴퓨터공학/포인터

초급편 4. 주소 가져오기

윤맨1 2015. 6. 30. 11:07

                                      포인터 토대가 된 책

                                         주소 가져오기

그래서, 포인터는 그 주소로 주소가 가리키는 메모리를 참조하는 기능과 단순한 수치로 그에 대한 가산하거나 할당하거나하는 기능의 두 가지 측면이 있음을보고왔다.

C 언어에서 변수로 사용되는 것은 원칙적으로 모든 주소를 검색 할 수있다.

예를 들어

int x;                   / * 예를 들어 1000 번지 * /
int * p;

void main ()
{
        x = 10;          / * 1000 번지가 10이 * / 
        p = & x;          / * p = 1000 * / 
        * p = 33;         / * 1000 번지 33합니다. * /
        printf ( "x = % d \ n", x);
}
(프로그램 4-1)

을 실행하면 10이 아니라 33을 출력한다. & 기호는 변수 x의 주소를 취득하는 것을 나타내, "p = & x;"는 변수 x의 주소 (구체적인 수치로는 모르는 경우가 많다)를 포인터 변수 p에 대입하고있다 . 그리고 포인터 변수 p가 가리키는 주소를 33로 고쳐 쓰고있다. 이를 통해 변수 x의 값이 쓰 바뀌는 것이다. 이때 포인터 변수 p는 변수 x의 별명으로서 기능하고있다.

이를 의사 어셈블러로 쓰면

MOV [1000], 10           ; x = 10 
MOV AX, 1000             ; p = & x 
MOV [AX] 33             ; * p = 33
(프로그램 4-2)

라고 바람 대응 관계가된다.

그래서 다음과 같은 것도 가능하다.

int x = 10;              / * 예를 들어 1000 번지 * / 
int y = 12;              / * 예를 들어 1004 번지 * / 
int z = 99;              / * 예를 들어 1008 번지 * /
int * p;

void main ()
{
        p = & x;          / * p = 1000 * / 
        * p = 0;          / * 1000 번지를 0으로 설정 * / 
        p = & y;          / * p = 1004 * / 
        * p = 0;          / * 1004 번지를 0으로한다 * / 
        p = & z;          / * p = 1008 * / 
        * p = 0;          / * 1008 번지를 0으로 설정 * /
        printf ( "x = % dy = % dz = % d \ n", x, y, z);
}
(프로그램 4-3)

이 경우 x도 y도 z도 모두 0이된다. 변수 형식이 일치하는 한 어떤 변수의 주소를 포인터 변수에 대입 할 수있는 것이다.

&에 의해 어떤 변수의 주소를 가져올 수 있는지 지금보고왔다. 그러나 배열의 경우에는 &를 사용할 필요가 없다. 배열 선언 할 때 배열 이름은 그대로 포인터로 해석된다.

int x [5] = {1, 2, 3, 4, 5};
int * p;

void main ()
{
        int i;

        p = x;
        for (i = 0; i <5; i ++) {
                * p = 0;
                p ++;
        }
}
(프로그램 4-4)

배열 x의 값은 0이된다. 이때 "p = x;"의 형태로 대체하고 있음에주의한다. 이 배열을 중간에서 액세스하기 위해서는 "p = & x [3];"처럼하고 &를 사용하여 대입한다.

과제

  1. 프로그램 4-3 다음 함수를 추가하여 포인터의 값을 확인 해보자.
    printf ( "x = % py = % pz = % pp = % p p-self = % p \ n", & x & y & z, p & p); 
    
  2. 다음 프로그램을 실행했을 때의 출력은 어떻게 될지 미리 예상 한 후 실제로 프로그램을 작성하고 예상을 체크해 보자.
    char str [] = { "test string"}; 
    void main ()
    {
            int i, len;
            len = strlen (str);
            for (i = 0; i <len; i ++) {
                    printf ( "% s \ n", & str [i]);
            }
    }