2012년 8월 30일 목요일

기억부류

변수에 저장된 값이 유효하게 사용될 수 있는 프로그램 내에서의 범위를 변수의 범위라고 한다. 변수의 사용영역에 따라 지역변수, 전역변수로 나뉠 수 있고, 변수의 존속기간에 따라 자동변수, 정적변수, 외부변수, 레지스터변수로 나뉠 수 있다.

외부 변수

전역 변수라고도 하며, 다른 함수에서 정의된 변수를 공유하고자 할 때 사용한다.
함수의 밖에서 선언되며, 여러 소스 파일 간에 사용하려는 때에는 extern 키워드를 사용한다. extern은 실제로 변수를 선언하는 것이 아니라 다른 파일에서 변수가 선언되었음을 알려주는 역할을 한다.
초기화되지 않은 경우에 0값을 가짐. 외부변수와 프로그램 데이터가 저장되는 데이터 세그먼트에 저장된다.
 1 #include <stdio.h>
 2 
 3 /*
 4      외부변수
 5 */
 6 
 7 int x = 100;
 8 
 9 void fun1()
10 {
11     printf("fun1 : x = %d\n", x);
12     x = 200; 
13 }
14 
15 int main ()
16 {
17     
18     printf("main : x = %d\n", x);
19     fun1();
20     printf("main : x = %d\n", x);
21     system("PAUSE");
22     return 0;
23 }


 1 #include <stdio.h>
 2 
 3 /*
 4     extern 전역변수 #1
 5 */
 6 void fun2(void);
 7 
 8 int x = 100;
 9 
10 void fun1()
11 {
12     printf("fun1 : x = %d\n", x);
13     x = 200;
14 }
15 
16 int main ()
17 {  
18     printf("main : x = %d\n", x);
19     fun1();
20     fun2();
21     printf("main : x = %d\n", x);
22     system("PAUSE");
23     return 0;
24 }


 1 #include <stdio.h>
 2 
 3 /*
 4     extern 전역변수 #2
 5 */
 6 extern int x;
 7 
 8 void fun2()
 9 {
10     printf("fun2 : x = %d\n", x);
11     x = 300;
12     printf("fun2 : x = %d\n", x);  
13 
14 }




내부 변수

자동변수

지역 변수라고도 하며, 함수 실행시에 만들어지며, 변수가 선언된 블럭이나 함수 내에서만 유효하고, 함수가 종료되면 메모리에서 제거된다.
auto 키워드를 사용해서 선언하며 생략해도 된다.  스택에 저장된다.
함수의 매개변수는 자동변수이다.

 1 #include <stdio.h>
 2 
 3 /*
 4     지역변수
 5 */
 6 int x = 100;
 7 
 8 void fun1()
 9 {
10     int x = 10;
11     printf("fun1 : x = %d\n", x);  
12 }
13 
14 int main ()
15 {  
16     printf("main : x = %d\n", x);
17     fun1();
18     printf("main : x = %d\n", x);
19     system("PAUSE");
20     return 0;
21 }


정적변수

변수의 기억영역이 프로그램이 종료될 때까지 계속 유지된다.
static 키워드를 사용해서 선언하며, 초기화되지 않은 때에는 0값을 가지며, 변수가 정의되는 처음에만 초기화가 수행되고 이후에는 값이 보존된다.
기본적으로는 블럭 내에서만 유효하지만, 함수의 바깥에 선언하는 경우에는 정적 외부변수가 된다.
 1 #include <stdio.h>
 2 
 3 /*
 4     정적 변수
 5 */
 6 
 7 void fun1()
 8 {
 9     static int x = 1;
10     printf("fun1 : x = %d\n", x);  
11     x++;
12 }
13 
14 int main ()
15 {  
16     fun1();
17     fun1();
18     fun1();
19     system("PAUSE");
20     return 0;
21 }

결과는 1, 2, 3이 출력된다.


레지스터변수

CPU 내의 레지스터에 값을 저장하려는 때에 register 키워드를 사용해서 선언한다. 레지스터에 값을 저장하면 실행 속도가 빨라질 수있지만 크기와 갯수가 한정되어 있으므로 register를 선언했다고해서 반드시 레지스터에 변수가 생성되는 것은 아니다.