[C언어] 포인터 : 포인터의 이해

조아리 ㅣ 2024. 9. 4. 11:11

반응형

주소와 포인터의 차이

주소는 변수에 할당된 메모리 공간의 시작 주소 값 자체고, 포인터는 그 값을 저장하는 또 다른 메모리 공간입니다. 따라서 주소 값은 바뀌지 않는 상수이고, 포인터는 다른 주소를 대입해서 값을 바꿀 수 있는 변수입니다.

 

주소와 포인터의 크기

포인터도 저장 공간이므로 그 크기가 있습니다. 컴파일러에 따라 다를 수 있으나  포인터의 자료형과는 관계없이 그 크기가 다 같다는 특징이 있습니다. 

 

#include <stdio.h>

int main(void){
    int a;
    char b;
    double c;

    int *pa = &a;
    char *pb = &b;
    double *pc = &c;

    printf("pa의 크기 : %u\n", sizeof(pa));
    printf("pb의 크기 : %u\n", sizeof(pb));
    printf("pc의 크기 : %u\n", sizeof(pc));

    return 0;
}
반응형
실행 결과

pa의 크기 : 4
pb의 크기 : 4
pc의 크기 : 4

 

위 코드를 통해 int, char, double 모두 크기가 다른 변수들을 가리키는 포인터들의 크기가 모두 같은 것을 확인할 수 있습니다.

 

 

포인터를 사용하는 이유

사실 포인터는 변수보다 불편한 점이 많습니다. 추가적인 변수 선언이 필요하고 주소 연산, 간접 참조 연산 등 각종 연산을 수행해야 합니다. 그래서 즐겨 사용할 필요가 없지만 임베디드 프로그래밍을 할 때 메모리에 직접 접근하는 경우나 동적 할당한 메모리를 사용하는 경우에는 포인터가 반드시 필요합니다.

 

두 변수의 값 바꾸기

다음 예제를 통해 포인터의 필요성을 확인해 보겠습니다. 

 

#include <stdio.h>

void swap(int*, int*);

int main(void){
    int a= 10, b= 20;

    swap(&a, &b);
    printf("a: %d, b: %d\n", a, b);
}

void swap(int *pa, int *pb){
    int temp;

    temp = *pa;
    *pa = *pb;
    *pb = temp;
}

 

실행 결과

a: 20, b: 10

 

이 예제는 두 변수의 값을 swap 함수를 통해 바꿉니다.

 

먼저 함수 매개변수를 a와 b의 주소로 지정하여 swap 함수를 호출합니다. 때문에 swap 함수의 매개변수는 포인터 변수 pa, pb가 됩니다. 각각 a와 b를 가리키는 상태가 됩니다.

 

이제 swap 함수에서 포인터 pa, pb에 간접 참조 연산을 수행하면 main 함수의 변수 a와 b를 자유롭게 사용할 수 있게 됩니다. pa가 가리키는 변수의 값은 temp로, pb가 가리키는 변수의 값은 pa로, temp의 값은 pb로 대입하면서 결국 pa와 pb가 가리키는 변수의 값이 바뀌게 되는 것입니다.

 

반응형