2010. 7. 10. 02:03

제 13장 C언어의 핵심, 함수 - 3

 

 

 


변수의 범위 : 함수와 변수의 관계를 따 져보다.

 

 ▽  변수의 특성에 따른 분류
 
 - 지역변수
: 중괄호{ }  내에 선언된 변수(Local Varial)

 - 전역변수 : 함수내에 선언되지 않는 변수(Gloval Varial)

 - 정적변수 : 함수 내부, 외부 모두 선언가능(Static Varial)

 - 레지스터 변수 : 선언에 제한이 많이 따름(Register Varial)

 

 

 

 static변수


 - 함수내부 및 외부에 선언가능


 - 한번만 초기화 된다 : 전역변수의 특징을 가진다


 - 함수내부에서 선언될 경우 함수내에서만 접근 가능
   > 지역변수의 특징 static int a;

 

예제) ========================================================

 

#include <stdio.h>

 

void Fuc(void)
{                          // 한번만 초기화 되기때문에
 static int num = 0; // 2번째 호출부터 실행되지 않는다.
                          // num값은 0으로 한번만 초기화가 이루어진다.
 num++;   

 printf("%d \n", num);
}                       // 함수를 빠져나와도, num은
                        // 값을 유지하면서 소멸되지 않는다!
int main()
{
 int i;  

 for(i=0; i<5; i++)
  Fuc();

 return 0;
}

=============================================================

 

 

 

register : cpu내의 가장가까운 기억장치(상당히 빠른 메모리)

 

 - 여유가 있는 메모리 공간은 아니다.(잘 사용하지 않는다)

 

 - regiter int b; // regiter 메모리공간에 변수를 선언한다.

 

 - 사용시, 많은 제약이 따른다

 

 


재귀 함수

 

 - 자기자신을 다시 호출하는 형태의 함수

 

 - 프로그램을 이용하기위해선 프로세서를 이해해야 한다.
   -> 컴퓨터 구조(H/W -> 운영체제)

   -> 운영체제 


 - 자기자신을 계속 호출하기때문에, 이해하기보다는

 

 - 코딩시 조금만 신경써서, 분석하며 작성하는게 좋다!

 

 - 하지만 스택오버플로우(메모리과다사용으로 인한 경고)를 조심한다.
 


예제 ) ==========================================================

 

#include <stdio.h>

 

void Print()
{
 printf("재귀함수 호출 \n");
 Print();                         // 자기자신을 다시 호출한다.
}                                  // 무한루프에 빠지게 된다.

int main()
{
 Print();
 return 0;
}


예제 )==========================================================

 

#include <stdio.h>

 

void Repeat(int n) // 함수선언 및 정의
{
 printf("재귀함수 호출\n");
 if(n==1)            // if문은 재귀함수를 빠져나가기 위한 조건
  return ;            // return문 용도 : 함수 빠져나오거나, 값을 반환할때 쓰임
 Repeat(n-1);    // n값은 1씩 감소하면서 호출해 나간다.
}                     // 결국 n값이 1이 되면 빠져나가게 되는 함수

int main()
{
 int a = 4;
 Repeat(a);      // 함수호출

 return 0;
}

// -> 핵심 :  무한 재귀호출을 위해서 탈출조건을 잘 구현해야함


※ 재귀함수의 대표적인 사례는 팩토리알 (factoral)계산
  n! = (n-1) * (n-2)......* 2 * 1
  5! = 5 * 4 * 3 * 2 * 1


예제 )==========================================================

 

#include <stdio.h>

int Fat(int n);


int main()
{
 int input;  

 printf("정수 하나 입력 : ");
 scanf("%d", &input);

 printf("%d! = %d \n", input, Fat(input));
 return 0;
}

int Fat(int n)
{

 if(n==0)                  // n값이 1이면 빠져나가게 한다.
  return 1;

 else
  return n*Fat(n-1); // Fat함수를 호출시 매개변수 값이
                             // 1씩 감소하면서 호출한다
}

Posted by 토실토실천재