기본 콘텐츠로 건너뛰기

기억부류

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

외부 변수

전역 변수라고도 하며, 다른 함수에서 정의된 변수를 공유하고자 할 때 사용한다.
함수의 밖에서 선언되며, 여러 소스 파일 간에 사용하려는 때에는 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를 선언했다고해서 반드시 레지스터에 변수가 생성되는 것은 아니다.

이 블로그의 인기 게시물

특수문자와 서식화 문자

ASCII 특수 문자\a경고음 발생\b백스페이스\f폼 피드\n개행\r캐리지 리턴\t수평 탭\v수직 탭\\역 슬래시 (\)\'작은 따옴표 (')\"큰 따옴표 (")
서식 문자%d, %i10진 정수%x, %o16진수, 8진수 정수(양수만)%f, %lf10진수 실수%c하나의 문자%s문자열%u10진 정수 (양수만)%e지수표기법에 의한 실수%E지수표기법에 의한 실수%g소수점 이하 자리수에 따라 %f, %e중 하나를 선택%G소수점 이하 자리수에 따라 %f, %e 중 하나를 선택%%%기호 출력
%03d필드 폭을 3칸 확보하고 남는 자리는 0으로 채움%-3d필드 폭을 3칸 확보하고 왼쪽 정렬%+3d필드 폭을 3칸 확보하고 오른쪽 정렬. 부호 출력.

C 표준, GCC 그리고 컴파일 옵션

GCC supports three versions of the C standard, although support for the most recent version is not yet complete.
The original ANSI C standard (X3.159-1989) was ratified in 1989 and published in 1990. This standard was ratified as an ISO standard (ISO/IEC 9899:1990) later in 1990. There were no technical differences between these publications, although the sections of the ANSI standard were renumbered and became clauses in the ISO standard. This standard, in both its forms, is commonly known as C89, or occasionally as C90, from the dates of ratification. The ANSI standard, but not the ISO standard, also came with a Rationale document. To select this standard in GCC, use one of the options -ansi-std=c90 or -std=iso9899:1990; to obtain all the diagnostics required by the standard, you should also specify -pedantic (or -pedantic-errors if you want them to be errors rather than warnings). See Options Controlling C Dialect. Errors in the 1990 ISO C standard were corrected in two Technical C…

조건문

if 1 if(조건) 명령문;

if - else 1 if(조건) 2 { 3 명령문1; 4 } 5 else 6 { 7 명령문2; 8 }

if - else if 1 if(조건) 2 { 3 명령문1; 4 } 5 else if 6 { 7 명령문2; 8 } 9 else10 {11 명령문3;12 }

switch - case case절에는 break문을 사용해서 다른 절이 실행되지 않도록 해야 한다. case절에서 제시된 조건 중에 하나도 맞지 않는 경우에 default절이 실행된다. 1 switch(조건) 2 { 3 case 값1: 4 명령문1; 5 break; 6 7 case 값2: 8 명령문2; 9 break;10 11 default:12 명령문3;13 }