콘텐츠로 건너뛰기

C 포인터

변수는 어떤 값을 저장하기 위한 메모리 공간이다. 그러면 포인터변수는 무엇일까?

포인터 변수는 “주소 값”이다.

설명은 아랫 코드에 달았다.

#include <stdio.h>

int main(void) {
    
    int a=1; //a변수에 1을 대입한다.
    int* pa=&a; // 포인터형 변수pa에 주소값을 대입한다.
    
    printf("변수 a의 값 : %d\n", a);

    *pa=2; //pa주소 값의 역참조. 역참조 되었으니 그 공간을 의미한다. 여기서는 a공간에 2를 넣는다라는 의미이다.
    
    printf("역참조를 이용해서 a의 값을 바꾼 후의 a 값 : %d\n", a);
    printf("a 변수의 실제 메모리상에서의 위치(주소) %p\n", &a);
    
    printf("실제 주소 값을 입력 한 후 그 주소에서의 값 출력 : %d\n",*(unsigned int*)0x000000000061fe14); // (1)
    // 처음에는 변수 a공간의 주소값을 모른다. 그러므로 윗 행을 코멘트 처리 한 후, 실행해서 출력창에서 그 값을 복사해 온 후 코멘트를 해제한다.
    
    // 캐스팅 연산자 앞에 *(역참조)를 붙였다. 즉, 주소의 값을 다루겠다는 의미이다.
    // (unsigned int)가 아닌 (unsigned int*)을 사용한다.
    // (unsigned int)라는 것은 오른쪽 내용이 부호없는 정수로 해석하라는 의미이다.
    // (unsigned int*)가 되면 오른쪽 내용이 포인터(주소)라는 것으로 바뀐다. 또는 포인터(주소)로 변환된다.
    
    printf("pa의 주소를 출력한다.: %p\n", pa); // pa가 주소임을 알 수 있다.
    printf("a의 값을 직접 주소를 입력해서 구한다. : %d\n",*(unsigned int*)pa); // (2)
    printf("a의 값을 포인터 변수 pa에 역참조 해서 구한다. : %d\n",*pa); // (3)
    //결론! (1), (2) 및 (3)을 보면 pa는 주소 값임을 알 수 있다.

    return 0;
}

위 내용을 개발툴에 넣고 빌드한 후 실행해보자.

E:\shkim\temp>main
변수 a의 값 : 1
역참조를 이용해서 a의 값을 바꾼 후의 a 값 : 2
a 변수의 실제 메모리상에서의 위치(주소) 000000000061FE14
실제 주소 값을 입력 한 후 그 주소에서의 값 출력 : 2     
pa의 주소를 출력한다.: 000000000061FE14
a의 값을 직접 주소를 입력해서 구한다. : 2
a의 값을 포인터 변수 pa에 역참조 해서 구한다. : 2

E:\shkim\temp>

일반 변수는 우리가 변수가 저장되는 번지를 이용해서 그 값의 저장소 역할 만을 담당한다.

그러나 우리가 포인터 변수를 사용한다고 하면, 일단은 우리는 그 공간을 이용해서 특정 작업을 할 목적을 가지고 포인터 변수를 선언한다는 것이다.

도입부의 코딩을 보면 변수 a를 선언하고 포인터 변수 pa를 선언하였다. 즉, pa를 가지고 변수 a를 다루겠다는 의미이다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다