2. 2
Storage Classes
§ Local 변수
– Function안에서 선언되는 variable
– 선언된 function 안에서만 사용 가능
– Function이 호출될 때 function 내부에 선언된 local variable
들은 시스템 스택에 생성되었다가 return하면 없어진다.
• 이후 그 Function이 다시 호출되면, 새로운 영역의 memory가
할당되며, 이전의 값은 유지되지 않는다.
int sum( int k ) {
int a ;
a = k + 3 ;
return a ;
}
3. 3
Storage Classes
§ Local 변수
void func(void) {
int k = 0;
printf( “%dn”, k ) ;
k = 10 ;
printf( “%dn”, k ) ;
}
#include <stdio.h>
void func(void);
int main(void) {
float f = 0 ;
printf( “%fn”, f ) ;
func() ;
func() ;
return 0;
}
4. 4
Storage Classes
§ Global 변수
– Function block 밖에서 선어된 변수
– 모든 함수에서 사용 가능
– 프로그램이 시작할 때 생성된 후 프로그램이 종료될 때까지
메모리에 존재
• 생성된 후 자동으로 0으로 초기화 된다.
int g ;
int main()
{
printf( “%dn”, g );
my_func();
printf( “%dn”, g );
return 0;
}
void my_func()
{
g = 10;
}
5. 5
Storage Classes
§ Global 변수
void func(void) {
int k = 0;
printf( “%d %dn”, k, ++g );
k = 10;
printf( “%d %dn”, k, ++g );
}
#include <stdio.h>
int g;
void func(void);
int main(void) {
printf( “%dn”, g );
func();
printf( “%dn”, g );
return 0;
}
6. 6
Storage Classes
§ static 변수
– global변수와 매우 유사
• 프로그램 시작할 때 생성되었다가 프로그램 끝날 때까지 메모리에
존재
• 변수가 생성된 이후 자동적으로 0으로 초기화가 됨
– Function내부에서 선언된 경우
• 선언된 function 내에서만 접근 가능
– Function 외부에서 선언된 경우
• 선언된 source file내에서만 접근 가능 (추후 여러 파일로 프로그램
작성하기 참고)
7. 7
Storage Classes
§ static 변수
void func(void)
{
static int s ;
int k = 0;
printf( “%d %dn”, k, ++s ) ;
k = 10 ;
printf( “%d %dn”, k, ++s ) ;
}
#include <stdio.h>
void func(void);
int main(void)
{
func() ;
func() ;
return 0;
}
8. 8
Scope Rules
§ static 변수
– 예제: 함수가 몇 번째 호출 되었나?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void do_nothing(void) ;
int main(void)
{
int j ;
srand( time(NULL) ) ;
for( j = 0 ; j < 10 ; j++ )
if( rand() % 2 ) do_nothing() ;
return 0;
}
void do_nothing(void)
{
static int cnt ;
printf( “do_nothing is called %d time(s)n”, ++cnt ) ;
}
9. 9
Storage Classes
§ register 변수
– memory 중에서 가장 빠른 register를 사용하도록 요청
– int만 register로 선언가능
– register로 선언하지 않아도 register에 할당될 수 있고,
register로 선언했어도 register에 할당되지 않을 수 있음
[Ex]
int main() {
register int i; /* register i 와 같음 */
for(i = 0; i < LIMIT; ++i) {
…
}
}
10. 10
const
§ const
– 값을 수정할 수 없는 변수를 선언할 때 type의 앞에 사용
– 선언할 때 반드시 초기화해야 함. 초기화후 값 변경 불 가능
– 변수의 값을 바꿀 수 없도록 선언하는 것.
• 상수를 선언하는 것 아님
[Ex] const int a = 1;
[Ex] const int a = 1;
a = 4; /* error!! */
a++; /* error!! */
11. 11
Scope Rules
§ Scope Rules
– 어느 특정 identifier의 접근 가능성 여부 판단
– declaration statement위치에 따라 접근 범위 결정
– block안에서 선언된 identifier
• 그 block안에서 만 접근 가능
• 그 block이 수행될 때 변수가 생성되었다가 수행이 끝나면 변수
가 없어짐
– block 밖에서 선언된 identifier
• 기본적으로 모든 block에서 접근 가능
• 프로그램이 시작할 때 생겼다가 프로그램이 끝날 때 없어짐.
12. 12
Scope Rules
§ Scope Rules
#include <stdio.h>
int g ;
void function() {
static int a ;
printf(“a=%d g=%d”, a, g);
}
int main(void) {
int a = 3, b = 4;
{
int b=5;
printf(“%d %d”, a, b, g);
}
printf(“%d %d”, a, b, g);
function() ;
}
각각의 변수가 언제 생겼다가
언제 없어지는가?
어느 변수가 어느 변수를
의미하는가?