본문 바로가기
Program/C

17. C언어 지역변수의 범위

by Murciellago 2021. 11. 28.
반응형
SMALL

이 장에서는 지역 및 전역 변수의 범위와 수명에 대해 설명하겠습니다. 또한 정적 및 레지스터 변수에 대해 설명합니다.

 

 C언어 프로그래밍의 모든 변수에는 유형과 스토리지 클래스의 두 가지 속성이 있습니다.

 

유형은 변수의 데이터 유형을 나타냅니다. 그리고 스토리지 클래스는 변수의 범위, 가시성 및 수명을 결정한다.

 

4가지 유형의 스토리지 클래스가 있다.

- automatic

- external

- static

- register

 

 

1. 지역변수

블록 내부에 선언된 병수는 자동 또는 로컬 변수이다. 지역변수는 선언된 블록 내부에만 존재한다.

 

예)

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main(void) {
  
  for (int i = 0; i < 5++i) {
     printf("C programming");
  }
  
 // Error: i is not declared at this point
  printf("%d", i);  
  return 0;
}
 
 

 

위 프로그램을 실행하면 undeclared identifier i라는 오류가 발생한다. 

왜냐하면 i는 for 루프 블록 내에서 선언되었고 블록 외부에서는 선언되지 않았기 때문이다.

 

예)

1
2
3
4
5
6
7
8
 
int main() {
    int n1; // n1 is a local variable to main()
}
 
void func() {
   int n2;  // n2 is a local variable to func()
}
 
 

 

 

위 예에서 n1이 main()문에 지역적이며 n2가 func()가 로컬이 되겠다.

 

n1변수가 내부에서 main()에만 존재하는 변수이고, n2변수가  func() 문에만 존재하기에 액세스 할 수 없음을 의미한다.

 

 

2. 전역변수

모든 함수 외부에서 선언된 변수를 외부 또는 전역변수라고 합니다.

프로그램 내부의 모든 기능에서 액세스할 수 있다.

 

예)전역변수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
void display();
 
int n = 5;  // global variable
 
int main()
{
    ++n;     
    display();
    return 0;
}
 
void display()
{
    ++n;   
    printf("n = %d", n);
}
 

 

output)

n = 7

 

전역변수가  file1에 선언되었다고 가정하면 다른 파일에서 file2를 해당 변수를 사용하려고 컴파일러하면 오류가 발생한다. 이 문제를 해결하기 위해 키워드를 extern함수를 사용하여 file2를 외부 변수가 다른 파일에 선언되었음을 나타내도록 한다.

 

 

3. 변수 등록

register 키워드는 레지스터 변수를 선언하는데 사용한다. 레지스터 변수는 지역 변수보다 빠르다.

그러나 최신 컴파일러는 코드 최적화에 매우 능숙하며 레지스터 변수를 사요하면 프로그램이 더 빨라질 가능성이 거의 없다. 주어진 애플리케이션에 대해 코드를 최적화하는 방법을 알고 있는 임베디드시스템에서 작업하지 않는 한 레지스터 변수를 사요하지 않는다.

 

 

4. 정적 변수

정적 변수는 static 키워드를 사용하여 선언된다. 예

정적 변수의 값은 프로그램이 끝날때까지 유지된다.

 

예)

static int i;

 

 

예) 정적변수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
void display();
 
int main()
{
    display();
    display();
}
void display()
{
    static int c = 1;
    c += 5;
    printf("%d  ",c);
}
 

 

output)

6, 11

 

첫 번째 함수 호출동안 값은 C는 1로 초기화 된다. C 값은 5만큼 증가하고 C 값은 화면에 출력값은 6이 된다.

두번째 함수 호출중에 C는 다시 1로 초기화되지 않는다. 왜냐하면 C는 정적 변수이므로 C값이 5만큼 증가하여 값은 11이 되어 화면에 출력된다.

 

반응형
LIST

'Program > C' 카테고리의 다른 글

18. C언어 함수 예  (0) 2021.11.28
16. C언어 재귀함수  (0) 2021.11.28
15. C언어 프로그래밍의 사용자 정의 함수 유형  (0) 2021.11.28
14. C언어 사용자 정의 함수  (0) 2021.11.28
13. C언어 전처리기와 매크로  (0) 2021.11.17

댓글