본문 바로가기
헝클어진 알고리즘

C 포인터

by 배굿맨 2023. 2. 2.

변수는 어떤 값을 저장하기 위한 메모리 공간이다.

그러면 포인터변수는 무엇일까?

 

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

 

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

#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를 다루겠다는 의미이다.