제 31강) 포인터를 이용한 함수 통신 |
오늘은 "강의에서 다루지 않았던"의 첫번째 시간입니다.
포인터를 이용하여 함수간의 통신을 하는 법에 대해서 알아봅시다.
번지 연산자& |
포인터를 이용하여 함수간 통신(Communication)을 하기 위해서는 "번지 연산자"를 사용합니다.
이 통신을 함으로써 다른 함수에서 값을 입력받아올 수 있고 이미 있는 변수의 값을 서로 바꾸어줄 수도 있습니다.
대표적인 포인터를 이용한 함수 통신으로는 스왑(Swap)이 있습니다.
#include <stdio.h>
void swap(int* _num1, int* _num2)
{
int tmp = *_num1;
*_num1 = *_num2;
*_num2 = tmp;
printf("Swap!!\n");
}
int main()
{
int num1 = 55, num2 = 13;
printf("num1: %d(%p), num2: %d(%p)\n", num1, &num1, num2, &num2);
swap(&num1, &num2);
printf("num1: %d(%p), num2: %d(%p)\n", num1, &num1, num2, &num2);
return 0;
}
이 예제는 "스왑(Swap)"이라는 기능을 C언어로 구현한 프로그램입니다.
Swap이란 어떤 변수안의 값을 서로 바꾸어주는 것을 의미합니다.
즉, 위의 그림으로 보자면 A(1), B(22)가 스왑을 하게 되면 A(22), B(1)이 되는 것입니다.
하지만 이때 각 변수의 주소는 변하지 않습니다.
(주소는 변하지 않고 값만 변합니다.)
위에 있던 예제를 다시 봅시다.
void swap(int* _num1, int* _num2)
{
int tmp = *_num1;
*_num1 = *_num2;
*_num2 = tmp;
printf("Swap!!\n");
}
먼저 스왑함수입니다.
두 인자를 포인터로 받습니다. 즉, 포인터(주소)가 오게 된다는 의미입니다.
3번줄: 그리고 내부에 두 값을 스왑하기 위해서 한 값을 임시로 저장하는 변수(tmp)를 선언합니다.
4번줄: 임시로 저장한 변수에 넣은 값과 같은 값을 가진 변수(_num1)의 값을 다른 값(_num2)으로 바꾸어줍니다.
5번줄: 다른 값(_num2)을 이전에 저장한 값(tmp -> _num1의 값)으로 바꾸어줍니다.
각각의 값들은 *를 사용하여 해당 주소에 있는 값에 직접 접근하여 바꾸게됩니다.
그림으로 표현하자면 위와 같습니다.
int main()
{
int num1 = 55, num2 = 13;
printf("num1: %d(%p), num2: %d(%p)\n", num1, &num1, num2, &num2);
swap(&num1, &num2);
printf("num1: %d(%p), num2: %d(%p)\n", num1, &num1, num2, &num2);
return 0;
}
메인함수에서는 스왑함수에 &를 넣어서 변수를 넣습니다.
&을 넣게 되면 해당 변수의 주소가 들어가게 되죠.
그래서 num1의 주소와 num2의 주소를 인자로 넣게 됩니다.
실행 결과는 다음과 같습니다.
다음 시간에는 |
강의에서 또 다루지 못했던 부분을 찾아서 알려드리겠습니다.
'Study > C언어' 카테고리의 다른 글
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 33 [라이브러리 함수1(변환, 랜덤)] (0) | 2019.02.16 |
---|---|
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 32 [다루지 않았던2(Call by ~)] (0) | 2018.10.28 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 30 [전역변수와 정적변수(static)] (0) | 2018.10.28 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 28 [전처리기(include, define, ifdef)] (0) | 2018.10.28 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 29 [소스파일의 분할(헤더파일)] (0) | 2018.10.28 |