본문 바로가기
프로그래밍언어/C 언어

[C 언어] 포인터를 사용하는 이유

by khsnote22 2022. 12. 7.

변수를 사용하는 가장 쉬운 방법은 이름을 쓰는 겁니다. 포인터를 사용하려면 추가적인 변수 선언이 필요하고 주소 연산, 간접 참조 연산 등 각종 연산을 수행해야 합니다. 그러니 포인터를 일부러 즐겨 사용할 필요는 없습니다. 그러나 임베디드 프로그래밍을 할 때 메모리에 직접 접근하는 경우나 동적 할당한 메모리를 사용하는 경우에는 포인터가 반드시 필요합니다.

 

// 포인터를 사용한 두 변수의 값 교환

#include <stdio.h>

void swap(int *pa, int *pb); // 두 변수의 값을 바꾸는 함수의 선언

int main(void)
{
	int a = 10, b = 20; // 변수 선언과 초기화
    
    swap(&a, &b); // a, b의 주소를 인수로 주고 함수 호출
    printf("a:%d, b:%d\n", a, b); // 변수 a, b 출력
    
    return 0;
}

void swap(int *pa, int *pb) // 매개변수로 포인터 선언
{
	int temp; // 교환을 위한 임시 변수
    
    temp = *pa; // temp에 pa가 가리키는 변수의 값 저장
    *pa = *pb; // pa가 가리키는 변수에 pb가 가리키는 변수의 값 저장
    *pb = temp; // pb가 가리키는 변수에 temp 값 저장
}

교환 작업은 swap 함수 안에서 포인터를 통해 진행되지만 실제로 바뀌는 값은 main 함수의 변수 a와 b가 됩니다. 결국 swap 함수는 포인터를 통해 main 함수의 변수 a, b를 공유하므로 두 변수를 직접 바꾸는 일이 가능해집니다. 이제 두 변수의 값을 바꾸고싶을 때는 언제든지 swap 함수를 호출하면 됩니다.

// 다른 함수의 변수 사용하기
#include <stdio.h>

void swap(void);

int main(void)
{
	int a = 10, b = 20; // 변수 선언과 초기화
    swap(); // 인수 없이 함수 호출
    printf("a:%d, b:%d\n", a, b); // 변수 a, b 출력
    
    return 0;
}

void swap(void) // 인수가 없으므로 매개변수도 없음
{
	int temp; // 교환을 위한 변수
    
    temp = a; // temp에 main 함수의 a 값 저장
    a = b; // main 함수의 a에 main 함수의 b 값 저장
    b = temp; // main 함수의 b에 temp 값 저장
}

함수 안에 선언된 변수명은 사용 범위가 함수 내부로 제한되므로 main 함수에 있는 변수 a, b는 다른 함수인 swap 함수에서 그 이름을 사용할 수 없습니다. 좀 더 정확한 설명은ㅇ변수가 선언된 시점부터 선언된 블록 끝까지로 제한됩니다. 결국 이 방법은 컴파일 단계에서 문제가 발생합니다. 다음 방법은 main 함수에서 a, b의 값을 swap 함수에 인수로 주는 방법입니다. 

#include <stdio.h>

void swap(int x, int y); // 두 변수의 값을 바꾸는 함수 선언

int main(void)
{
	int a = 10, b = 20; // 변수 선언과 초기화
    
    swap(a, b); // a, b의 값을 복사해서 전달
    printf("a:%d, b:%d\n", a, b); // 변수 a, b 출력
    
    return 0;
}

void swap(int x, int y) // 인수 a, b의 값을 x, y에 복사해서 저장
{ 
	int temp; // 교환을 위한 변수
    
    temp = x; // temp에 x 값 저장
    x = y // x에 y 값 저장
    y = temp; // y에 temp 값 저장
}

결국 swap 함수 안에서는 a, b의 복사복을 바꾸므로 main 함수의 두 변수 a, b의 값은 변함이 없게 됩니다. swap 함수에서 매개변수의 이름을 a, b로 사용해도 결과는 같습니다. 이름이 같아도 함수가 다르면 메모리에 별도의 저장 공간을 확보하므로 전형 다른 변수로 사용됩니다.