기본적으로 함수에 인자를 전달하는 방식은 두가지 이다.
- call by value
- call by reference
call by value 방식은 기존의값을 복사하고 따라서 원본이 남는다.
int main(void)
{
int val = 10;
fct(val);
printf("%d\n", val);
return 0;
}
int fct(int value)
{
value++;
return value;
}
call by reference 방식은 참조(주소 값)을 인자로 전달하는 방식인데
int main(void)
{
int val = 10;
adder(&val);
printf("val : %d", val);
return 0;
}
void adder(int *pVal)
{
(*pVal)++;
}
여기서는 변수 val 의 주소가 전달된다.(원본이 오는것)
그리고 여기에서 저번에 배운 개념을 복습하는 차원에서 언급하자면
adder함수에 있는 두개의 포인터는 연산자는 같지만
매개변수에 있는 포인터가 함수에서의 변수를 설정해주는 포인터 연산자이고
함수 본체에 있는 포인터가 pVal의 값을 참조하는 참조연산자이다.
<함수 인자로 1차원 배열 전달>
#include <stdio.h>
void fct(int *);
int main(void)
{
int arr[2] = {1,2};
fct(arr);
printf(“%d”, arr[0]);
return 0;
}
void fct(int *parr)
{
printf(“%d”, parr[0]);
parr[0] = 3;
}
1차원 배열을 받을때는 배열의 이름으로 받고
배열의 이름은 배열의 주소값이기 때문에
함수정의에서는 포인터로 받는다. 아니면 parr[] 이렇게 받아도 된다.
<함수 인자로 2차원 배열 전달>
#include <stdio.h>
void add_element(int (*arr)[2], int row);
int main(void)
{
int arr[3][2];
int i,j;
printf(“값 입력 : \n”);
for (i=0; i<3; i++) {
for (j=0; j<2; j++)
scanf("%d", &arr[i][j]);
}
add_element(arr, 3);
for (i=0; i<3; i++)
{
for (j=0; j<2; j++)
printf("arr[%d][%d] : %d \n", i, j, arr[i][j]);
}
return 0;
}
2차원 배열을 함수로 받을 때 매개변수를 쓰는 방법이 중요한데
꼭 (*arr)[2]로 쓰고 배열 포인터의 형식으로 선언해야한다.
소괄호를 빼고 *arr[2]로 쓰면 포인터 배열이 되기 때문에 안된다.
<함수 인자로 더블 포인터 전달>
main(){
int a, b;
int *pa, *pb;
pa = &a;
pb = &b;
pswap(&pa, &pb);
}
pswap(int **ppa, int **ppb){
int *temp = *ppa;
*ppa = *ppb;
*ppb=temp;
return 0;
}
함수 인자로 더블포인터를 전달하기도 하는데 이런것은 여러 함수가 관계가 얽혀있고 프로그램이 복잡해질때
다른 함수에서 포인터를 썼던것을 가져오려면 더블 포인터를 써야되는데 이 방법을 쓰지 않으면
코드가 지저분해지고 성능이 저하될 수 있다.
<함수 인자로 상수 인자 전달>
#include <stdio.h>
int read_val(const int val);
int main(void)
{
int a;
scanf("%d", &a);
read_val(a);
return 0;
}
int read_val(const int val)
{
val = 5; //허용되지 않는다.
return 0;
}
함수 인자로 상수 인자를 전달하는 것은 예를들어 라이브러리 함수같은 경우
다른사람이 그 함수를 썼을때 값이 바뀌지 않아야하기 때문에 사용한다.
현업에서 많이 쓰인다.