본문 바로가기
쿤즈 Dev/C

[C언어] 포인터를 이용한 함수 사용 방법

by :)Koon 2020. 12. 16.

앞선 포스팅에서 포인터란 무엇인지 정의부터, 포인터의 사용방법을 알아보았습니다. 또, 포인터와 배열을 연결하고 그들의 관계에 대해서도 알아보고 사용해 보았습니다.

 

2020/10/31 - [쿤즈 Dev/C] - [C언어] C언어의 꽃. 포인터를 알아보자!

2020/11/10 - [쿤즈 Dev/C] - [C언어] 포인터를 이용해서 배열 사용하기

 

이번 포스팅에서는 포인터와 함수와의 관계에 대해서 알아보고 그들의 사용 방법도 알아보도록 하겠습니다.


Call by value vs Call by reference

이쯤에서 항상 등장하는 용어입니다. Call by value 와 Call by reference입니다. 말 그대로 한 쪽은 값을 전달하고 다른 한 쪽은 주소, 즉 포인터를 전달하는 것입니다.

 

기존에 값을 전달하는 Call by value 는 함수에 관련된 포스팅을 하면서 한 번 다뤄봤습니다. 함수에 값을 전달하고 결과를 return 할때 다시 값을 전달하는 방법입니다.

 

2020/09/28 - [쿤즈 Dev/C] - [C언어] 함수(Function) (2) 사용자 정의 함수의 사용법

 

[C언어] 함수(Function) (2) 사용자 정의 함수의 사용법

지난 포스팅에서는 C언어에서 굉장히 중요한 함수(Function)라는 것을 올려드렸습니다. 표준 라이브러리 함수들은 프로그래밍에서 필수적으로 사용할 수 밖에 없는 함수들이며 기본적으로 정의된

koonsland.tistory.com

포인터에서는 값이 아닌 주소(포인터)를 전달할 수 있습니다. 이게 어떤 의미인지 예를 들어서 알아보도록 하겠습니다.


소스코드1 swap.c

#include <stdio.h>

void callbyvalue(int, int);
void callbyreference(int*, int*);

int main(int argc, char* argv)
{
    int num1 = 10;
    int num2 = 20;

    printf("num1 = %d, num2 = %d\n", num1, num2);
    callbyvalue(num1, num2); // call by value
    printf("num1 = %d, num2 = %d\n", num1, num2);
    callbyreference(&num1, &num2); // call by reference
    printf("num1 = %d, num2 = %d\n", num1, num2);

    return 0;
};

void callbyvalue(int n1, int n2) {
    int temp;
    temp = n1;
    n1 = n2;
    n2 = temp;
}

void callbyreference(int* n1, int* n2)
{
    int temp;
    temp = *n1;
    *n1 = *n2;
    *n2 = temp;
}

결과1

num1 = 10, num2 = 20
num1 = 10, num2 = 20
num1 = 20, num2 = 10

결과만을 보시면 callbavalue() 함수를 호출하였을때는 main에 선언된 값이 변하지 않았습니다. 하지만 callbyreference() 함수를 호출하면 main에 선언된 값이 변하게 됩니다. 이것이 값을 인자로 넘기는것과 포인터를 넘기는 것의 차이입니다.

 

callbyvalue() 함수에서는 num1, num2의 값을 함수의 인자로 넘겨주었습니다. 함수 내부로 들어가면 새로운 n1, n2 의 변수가 생성되거 전달받은 값을 저장해서 값을 바꿔주는 작업입니다. 따라서 main에 값은 영향을 받지 않습니다.

 

callbyreference() 함수에서는 num1, num2의 포인터값(주소)를 전달받습니다. 함수 내부에서도 전달받은 값의 포인터 주소를 가져오기 때문에 포인터가 가리키는 값을 직접 변경해줍니다. 따라서 main의 값도 영향을 받게 됩니다.

 

이 개념은 포인터에서 아주 중요한 부분입니다. 매개변수로 여러가지 값들을 넘겨줄수 있으며 함수 포인터도 넘겨줄 수 있습니다. 이 부분들은 나중에 다시 다뤄볼 예정입니다.


이번 포스팅에서는 포인터를 이용해서 함수에서 사용하는 방법을 알아보았습니다. 포인터가 복잡하고 어렵게 느끼는것은 익숙하지 않기 때문이라 생각됩니다. 함수에서 다시 다른함수로 포인터를 넘겨줄때는 더블포인터라 이름을 부르지만 원리는 똑같습니다.

 

자주 사용해보고 익숙해지면 포인터의 개념이 조금 더 잘 전달될것 같습니다.

댓글