📌함수


호랑이는 죽어서 가죽을 남기고, 함수는 죽어서 리턴을 남긴다!


📌매개변수(함수의인자)


  • 함수를 호출한 것과 함수를 서로 연결해 주는 통신 수단

메인함수 리턴값은 운영체제가 받아들인다(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;
}

call by value

  • 값을 복사해서 전달하는 방식
    main, change_val 안에서의 a의 주소가 다르기 때문에 값이 바뀌지 않는다.

call by reference

  • 값대신 주소값을 전달하는 방식
    main, chamge_val 안에서의 b의 주소는 똑같기 때문에 값을 바꿀 수 있다.

결론
어떠한 함수가 특정한 타입의 변수/배열의 값을 바꾸려면 함수의 인자는 반드시 그 타입을 가르키는 포인터를 이용해야 한다.


📌함수의 원형


#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)


문제(함수관련)


Function.c

참고자료


씹어먹는 C언어

profile
개인공부저장용(하루의 기록)

0개의 댓글

Powered by GraphCDN, the GraphQL CDN