본문 바로가기
공부/코딩 개념정리

[c 언어] 포인터 이해/ 포인터 매개변수 사용하기

by 소소하지만유니크한 2021. 5. 1.
728x90

c언어로 코드를 작성할 때, 함수에서 값을 여러 개 반환하고 싶으면 어떻게 해야 할까요?
파이썬에 익숙하신 분이라면 return 값을 ',(comma)'로 나열하여 반환하면 될 것으로 생각하시겠지만, c언어의 경우 해당 문법은 지원하지 않습니다! 
그렇다면 c언어는 어떻게 할까요? 전달하지 않고 함수 안에서 값을 바꾸면 어떻게 되는지 확인해 보겠습니다. 
 

반환값(return) 없이 매개변수를 교환하는 함수 작성

#include <stdio.h>

void swapNumber(int first, int second)   
{
    int temp;  

    temp = first;
    first = second;
    second = temp;
    printf("[In function] %d %d\n", first, second);
}

int main()
{
    int first = 10;
    int second = 20;

    swapNumber(first, second); 

    printf("[In main] %d %d\n", first, second);

    return 0;
}

swapNumber()를 통해서 first와 second를 매개변수로 전달해주고, first에 존재하던 값은 temp에 잠시 저장 후, second에 존재하던 값을 first로 넣고 second에는 처음 first 값이 들어있던 temp 값을 넣어줌으로써 두 변수에 존재하던 값을 교환해주는 함수를 작성했습니다. 결과는 어떻게 나올까요?
 

output:

[In function] 20 10
[In main] 10 20

결과는 위와 같이 함수 안에서 출력한 값은 두 값이 교환된 상태이지만, 메인함수에서는 초기화 시켜준 값 그대로 출력됩니다. 즉, 매개변수는 값을 함수로 전달하는 역할만 할 뿐 함수 바깥의 변수에는 전혀 영향이 없습니다. 그렇다면 c언어에서는 두 개 이상의 값을 변경하지 못하는 걸까요? 정답은 포인터를 이용하면 됩니다.

 

 

포인터를 이용하여 매개변수 교환 함수 작성

#include <stdio.h>

void swapNumber(int* first, int* second)
{
    int temp;

    temp = *first;
    *first = *second;
    *second = temp;
    printf("[In function] %d %d\n", *first, *second);  // 값을 출력할 땐 '*' 이용 
}

int main()
{
    int first = 10;
    int second = 20;

    swapNumber(&first, &second);  // '&'를 이용하여 주소를 매개변수로 전달

    printf("[In main] %d %d\n", first, second);

    return 0;
}

포인터를 사용하는 방법은 위와 같습니다. 함수의 매개변수 전달 시 '&'를 이용하여 주소를 전달해줍니다. 이 때 신경써야할 부분은 주소를 매개변수로 전달했기 때문에 함수 안에 first만 사용할 시에 이는 변수 주소를 뜻합니다. 해당 주소에 있는 값을 조작하고 싶을 땐 '*'를 이용하여 저장된 값으로 접근합니다.
 

output:

[In function] 20 10
[In main] 20 10

포인터를 이용하지 않았을 때의 결과와 달리 함수 안의 출력과 메인 함수에서의 출력이 동일함을 알 수 있습니다. 


포인터를 이용한 함수 안에서의 연산

#include <stdio.h>

void mutipleNumber(int* first, int* second)
{
    *first *= *second;
    printf("[In function] %d\n", *first);
}

int main()
{
    int first = 10;
    int second = 20;

    multipleNumber(&first, &second);
    printf("[In main] %d\n", *first);

    return 0;
}

매개변수를 포인터를 이용하여 전달하는 경우 함수안에서의 문법이 헷갈릴 수가 있습니다. 앞에서 언급했듯이 매개변수의 first와 second는 int*, 즉 주소이기 때문에, 값에 접근하고 싶은 경우에는 위의 코드와 같이 '*'를 사용합니다. 함수 안에서 first에 저장된 값은 second에 저장된 값을 곱해서 저장됩니다. 그렇기 때문에 위의 코드 결과 값은 아래와 같이 10에 20을 곱한 200이 출력됩니다. 
 

output:

[In function] 200
[In main] 200



 

 

728x90

댓글