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 | 함수 내부 또는 블록 |
동적 | 미정 | 소멸 | 함수 내부, 블록 |
'방송통신대학 > C 프로그래밍' 카테고리의 다른 글
다차원 배열 array (0) | 2020.06.05 |
---|---|
1차원 배열 array (0) | 2020.06.04 |
지역변수, 전역변수 variable (0) | 2020.06.02 |
값에 의한 자료전달, 참조에 의한 자료전달 (call by value / call by reference) (0) | 2020.06.01 |
함수의 호출 function (0) | 2020.05.31 |