c언어 기초

함수의 정의와 선언

달달고냥 2017. 3. 28. 17:42

1. 함수를 정의하는 이유

  • 모듈화에 의한 프로그램의 질 향상이 가능
  • 유지 보수 및 확장의 용이성
  • 문제 해결의 용이성 : "Divide and Conquer!"


2. 4가지 형태의 함수

  • 전달 인자 有, 반환 값 有
  • 전달 인자 有, 반환 값 無
  • 전달 인자 無, 반환 값 有
  • 전달 인자 無, 반환 값 無
- 입력이 없는 경우  int foo(void)
- 출력이 없는 경우  void foo(int)
- 입력과 출력이 모두 없는 경우   void foo(void )


3.main 함수 다시 보기 : 함수의 기본 형태


4. 함수의 정의와 선언


4-1.

전달 인자와 반환 값, 둘 다 있는 함수




4.2 함수 호출 과정의 이해

#include <stdio.h>

int Add(int i, int j)

{

    int result = i + j;

    return result;

}

int main(void)

{

    int d;

    d = Add(3, 4);

    printf("%d \n", d);

    return 0;

}

 




4.3 함수 선언의 필요성

컴파일러의 특성상, 함수는 호출되기 전에 정의되어야 한다. 





4.4 함수 선언의 의미

이후에 정의될 함수에 대한 정보 제공



4.5 변수의 범위(scope)

* 변수의 특성에 따른 분류

지역 변수(Local Variable) 

중 괄호 내에 선언되는 변수


* 전역 변수(Global Variable)

함수 내에 선언되지 않는 변수


* 정적 변수(Static Variable)

함수 내부, 외부 모두 선언 가능


* 레지스터 변수(Register Variable)

선언에 제한이 많이 따름


4.5.1 지역 변수의 접근 범위

지역 변수는 선언 된 함수 내에서만 접근 가능


 int fct_one(void)

{

     int one=0;

       

     return 0;

}


    <- 범위 1

int fct_two(void)

{

     int two=0;

     int one=0;

       

     return 0;

}


   <- 범위2 


* 지역 변수의 메모리상 존재 기간


- 1단계 


 int fct_one(void)

{

     int one=10;

     return 0;

}

int fct_two(void)

{

     int one=20;

     int two=30;

     return 0;

}

int main(void)

{

     int val=10;

     fct_one();

     fct_two();

     return 0;

}


 




- 2단계 



- 3단계




- 4단계




4.5.2 전역 변수

- 프로그램 어디에서나 접근이 가능한 변수
- 특정 영역(함수, 반복문...)에 속하지 않는다.
- 프로그램이 종료될 때까지 존재

전역 변수의 또 다른 특징
- 같은 이름의 지역 변수에 의해서 가려지기도 한다. 


static 변수

함수 내부 및 외부에 선언 가능하다.

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

함수 내부에서 선언될 경우 함수 내에서만 접근이 가능하다 : 지역 변수의 특징

예제 static_val.c


보다 빠르게! register 변수

int main(void)
{
   int a ;
   register int b; // 레지스터 변수 b 선언
   . . . . .


/* static_val.c */

#include <stdio.h>


void fct(void);


int main(void)

{

     int i;

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

          fct();


     return 0;

}


void fct(void)

{

     int val=0; // static int val=0;

     val++;

     printf("%d ",val);

}