반응형
SMALL

5.4.2 기억 클래스의 종류

변수의 기억 클래스 종류

- 변수의 초기화, 존속기간, 유효범위에 따라 구별

  > 자동 변수 (auto)

  > 정적 변수 (static)

  > 외부 변수 (extern)

  > 레지스터 변수 (register)

기억클래스를 이용한 변수선언

- 형식 : 기억클래스 자료형 변수명;

- 기능 : 기존의 변수 선언문에 기억클래스만 기입
          선언된 변수에 저장된 자료는 해당 기억영역에 놓이게 됨

- 사용 예 :
               auto int a;
               static int b;
               extern int c;
               register int d;              

(1) 자동변수

- 함수 실행시 만들어지고, 실행이 끝나면 기억공간이 제거됨

- 예약어 auto 를 사용 (생략 가능)

- 통용 범위는 변수가 선언된 블록이나 함수 내로 한정

- 지역변수에 해당

- 초기화가 필요

 

//자동변수의 사용 예 
#include <stdio.h>  
void main(){ 
   int i = 1;           
   auto int j = 2;  
/*함수 내 자동변수 선언 main() 함수  내에서만 사용가능(auto생략가능) */ 

      { /*블록1*/ 
         int i = 3;  // 자동변수로서 블록 1에서만 사용가능
         {/*블록2 */ 
            int i = 4; // 자동변수로서 블록 1에서만 사용가능
            printf(" 블록2의 i = %d\n ", i);  
            printf("블록2의 j = %d\n ", j);    
             printf("블록1의 i = %d\n", i);     } 
        printf(" void main() 함수내의 i = %d\n", i);    }

 

 

(2) 정적변수

- 기억영역이 프로그램 끝날 때까지 유지

- 예약어 static 을 사용

- 전역 변수에 해당 

- 변수의 값은 프로그램 실행 중 계속 유지

- 초기화가 없으면 0 으로 초기화 됨

 

#include <stdio.h> 
void static_test(); 
void main(){ 
   int i = 0; 
   while( i < 5){ 
      static_test(); 
      i++;    }  }

   void static_test(){ 
   static int s; /* 정적변수 s가 0으로 자동 초기화 되고  이후에 호출되면 초기화가 안됨 */ 

  auto int a = 0;  // 자동변수 a 선언 
   ++s; 
   ++a; 
   printf("static s = %d, auto a = %d \n", s, a) ; }

 

(3) 외부변수

- 함수의 외부에서 선언

- 예약어 extern 을 사용

- 전역 변수에 해당

- 초기화가 없으면 0으로 초기화 됨

- 다른 파일에서 외부변수로 선언된 변수의 값을 참조할 수 있다.

 

//외부변수의 사용예

#include <stdio.h>
int i = 10;
int j = 20;
void main(){
      extern int i; 
/* 외부변수 선언(생략가능, 변수 i 가 선언되면  선언된 위치 이하부터 그 값이 유효하기 때문) */ 
      extern int k; /* 외부변수 선언(생략불가,  변수 k 가 범위 바깥에 있으므로) */ 
      int j = 100;
 /*변수 j = 20, j = 100이 동시에 있을 경우 자동변수(지역변수)가 우선 */ 

     printf("i=%d j=%d k=%d",i,j,k);  } 
int k = 50;

 

 

(4) 레지스터 변수

- CPU 내의 레지스터에 자료를 저장하고자 할 때

- 예약어 register 를 사용

- 자동 변수가 동일한 속성

- 프로그램의 실행속도 증가를 목적으로 사용

  ( 주로 반복문에서 카운터 변수로 사용 )

 

//사용 예

#include <stdio.h> 
void main(){
register int num1 = 10; // 변수 num1은 CPU의 레지스터를 사용
register long long int num2 = 20;  // 변수 num2는 CPU의 레지스터를 사용  (32bit 컴퓨터인 경우 컴파일에러 발생 ) 
printf("num1 size = %d, num2 size = %d \n", sizeof(num1), sizeof(num2));

num2 = 0; 
for(num1 = 0; num1 <= 10; ++num1) 
num2 += num1; 
num1--; 
printf("num1 = %d, num2 = %lld", num1, num2);}

 

 

기억 클래스 예약어 사용 위치 기억 방식 초깃값 수명 범위
자동변수 auto 또는 생략 함수 내부
또는 블록
동적 미정 소멸 함수 내부
또는 블록
정적변수 static 함수 내부
또는 내부
--------------
함수 외부
정적
----------
정적
0
---------
0
불멸 삼수내부
또는 블록
--------------
변수가 선언된
전체파일영역
외부변수 x
-------------
extern
-------------
extern
함수 외부
-----------
함수 외부
-----------
함수 내부
또는 블록
정적
------------
x
------------
x
0
------------
x
------------
x
불멸
-----------------
-
---------------
-
변수가 선언된
전체파일영역
---------------
변수 선언 파일
---------------
함수 내부, 블록
레지스터변수 register 함수 내부
또는 블록
동적 미정 소멸 함수 내부, 블록

 

반응형
LIST

+ Recent posts