함수 전달의 3가지 - 참조(reference), 주소(address), 값(value), 재귀함수, touch, ifndef
- 함수 전달의 3가지
참조(reference) / 주소(address)
값(value)
⇒ 참조는 주로 객체 지향에서 나오는 말이다. 그렇기에 객체 지향에서는 주소와 값을 묶어서 같은 카테고리로 생각해 볼 수 있다.
⇒ C에서는 참조가 없으므로 주소와 값으로 생각하며, 참조와 주소는 같은 의미로 쓴다고 생각한다.
※ 가장 확실한 것은 3가지를 각각으로 생각하는 것이다.
- 재귀함수(recusive fuction)
⇒ 함수의 실행부 내에서 그 자신을 호출하는 함수.
⇒ 재귀호출은 프로그램을 매우 간결하게 작성할 수 있도록 해주며, 프로그램 내의 모든 반복문은 재귀호출로 바꿀 수 있고, 그 역으로 모든 재귀 호출은 반복문으로 고쳐 쓸 수 있다.
// 양의 정수 n을 입력받아, 재귀 호출을 이용하여 n부터 1까지 출력하는 프로그램
#include<stdio.h>
void recursive_print(int n); // 함수의 선언
int main()
{
int num;
printf("Please enter a positive integer: ");
scanf("%d", &num);
recursive_print(num);
return 0;
}
void recursive_print(int n)
{
if(n<=0) // 함수의 종료 조건
{
return;
}
else
{
printf("recursive_print: n = %d\n",n);
recursive_print(n-1); // 함수의 재귀 호출. 즉, 스스로를 호출한다.
}
return;
}
⇒ 실행결과
→ 재귀함수의 기본적인 형태는 if-else문이다. if 절에서는 종료 조건을 명시하고 함수의 실행을 종료시킨다. else 절에서는 반복해서 재귀호출을 시도한다. 이때 재귀호출 인수를 변경하여 마지막에는 제귀호출이 종료하게 된다.
→ main 함수를 재귀함수의 형태로 사용하면은 무한히 반복한다.
※ 윈도우에서 생각해 보면 이것은 stack이 계속해서 쌓이게 되므로 문제가 발생한다. 그리고 이렇게 stack이 계속 쌓여 다른 영역의 stack을 침범하는 것을 stack overflow 라고 하며 해킹의 방법이 되기도 한다.
※ 재귀함수의 문제는 stack을 많이 사용하게 되는 것이다. 재귀함수는 stack을 함수의 반복이 끝날 때 까지 반환하지 않고 계속 사용하게 된다. 즉, 반복의 크기가 stack의 한도를 초과하게 되면 비정상적인 문제가 발생한다.
※ stack이 과도하게 많아진다는 것은 메모리의 사용량이 증가하게 되고 문제를 발생시킨다.
※ 그렇기 때문에 재귀함수는 프로그램을 간결하게 하는 장점에도 불구하고 남용해서는 안된다. 특히 큰 프로그램 등을 통해 반복을 많이 하게 된다면 재귀함수는 무척이나 위험하다.
※ 프로그램의 분석을 위해 재귀함수 종료조건은 확실히 알아두어야 한다.
※ touch test.h → 0byte 짜리 test.h 파일이 생성된다. 만약 test.h 파일이 원래 있었다면 파일의 수정 시간이 바뀐다.
⇒ touch 파일명.확장자 를 하게 되면 파일의 수정 시간이 바뀌게 된다.
#include"test.h"
→ 현재 디렉토리로부터 test.h를 포함한다는 뜻.
→ “ ”는 외부파일을 불러올 때 사용하며 < >는 라이브러리에서 참조할 때 구분해서 사용한다.
⇒ ifndef → if not def(define test가 되어있지 않으면)
⇒ #if 와 #endif 중괄호와 같은 역할이며 안에 함수 원형을 넣을 수 있다.
⇒ vi /usr/inclue/stdio.h 를 확인해 보면 동일 include를 하나만 인지하도록 위와 같은 형식이 선언되어 있다.
'내장형 하드웨어 > C언어' 카테고리의 다른 글
함수 포인터(function pointer), 배열 (0) | 2011.05.09 |
---|---|
수학 함수 (math.h), 난수 생성 함수(랜덤 함수) rand - srand, seed, time(NULL) (0) | 2011.05.06 |
stack 구조, 어셈블리 (MASM, 코드 분석) (0) | 2011.04.29 |
visual studio 6.0 debug mode - stack (esp, sbp, eip) (0) | 2011.04.28 |
assembler - stack의 이해 (ebp, esp, eip) (0) | 2011.04.27 |