호랑이는 죽어서 가죽을 남기고, 함수는 죽어서 리턴을 남긴다!
메인함수 리턴값은 운영체제가 받아들인다(0 정상종료 1비정상)
#include <stdio.h>
int change_val(int a, int *b) {
a = 10;
*b = 10;
return 0;
}
int main() {
int a, b;
a = 2;
b = 3;
printf("변경전: call by value: %d\n", a);
printf("변경전: call by reference : %d\n", b);
change_val(a, &b);
printf("변경후: call by value: %d\n", a);
printf("변경후: call by reference : %d\n", b);
return 0;
}
값을 복사해서 전달
하는 방식주소값을 전달
하는 방식결론
어떠한 함수가 특정한 타입의 변수/배열의 값을 바꾸려면 함수의 인자는 반드시 그 타입을 가르키는 포인터를 이용해야 한다.
#include <stdio.h>
int change_val(int* a);
int main() {
int a;
a = 2;
printf("변경전 : %d\n", a);
change_val(&a);
printf("변경후 : %d\n", a);
return 0;
}
int change_val(int* a) {
*a = 10;
return 0;
}
컴파일러에게 함수에 대해서 미리 알려주는 것이다.
오류가 생길시 컴파일러가 알려준다.
int two_dimen(int parr[][2]);
int main()
{
int arr[][2] = { {1,2},{3,4} };
two_dimen(arr);
printf("\n");
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
printf("%d ", arr[i][j]);
}
}
}
int two_dimen(int parr[][2]) //(*parr)[2]와 동일
{
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
printf("%d ", parr[i][j]);
parr[i][j]++;
}
}
}
배열의 변수명은 첫 번째 원소의 주소값(sizeof, &와 같이 쓰일때는 제외)
(함수의 리턴형) (*포인터 이름)(첫번째 인자 타입, 두번째 인자 타입,....)
인자가 없으면 괄호안을 비워두면 된다.
int max(int a, int b);
int main()
{
int a, b;
int (*pmax)(int, int);
pmax = max;
scanf("%d %d", &a, &b);
printf("max(a,b) : %d \n", max(a, b));
printf("pmax(a,b) : %d \n", pmax(a, b));
return 0;
}
int max(int a, int b)
{
if (a > b)
{
return a;
}
else
return b;
return 0;
}
특정한 함수의 시작 주소값을 알려면 그냥 함수를 넣으면 된다(배열과 같음)
pmax = &max(x)
pmax = max(o)