끄적끄적

반응형

4. 정적 변수(Static variable) 


정적 변수는 변수가 소멸되지 않고 계속 남아있는 측면에서는 외부변수와 차이가 없지만 정적 변수에는 전역/지역의 개념을 가진다는 점이 외부변수와의 차이점입니다. 

정적 변수는 함수 내부에서 선언하면 지역변수가 되고 함수 외부에서 선언하면 전역 변수가 됩니다. 

정적 변수는 자동변수나 레지스터 변수가 블록을 빠져 나갈 때마다 초기화 되는 반면에 정적 변수의 값은 소멸되지 않고 다시 해당 블록으로 돌아왔을 때 기존의 값에 누적한다는 점이 다릅니다. 


u 정적 변수의 특징 

키워드: static 

유효범위: 변수가 선언된 블록 내부 

블록 내에서는 기존의 값을 그대로 보존합니다. 

초기화는 자동적으로 이루어집니다. 

문자인 경우에는 null 정수 형인 경우는 0, 실수 형인 경우는 0.0으로 초기화 됩니다.

   

 

8-5 실습예제 (auto변수와 정적 변수의 차이를 알아보는 프로그램) 


#include <stdio.h> 

void var() 

    int i = 20; 

    static int j = 20; 

    ++i; 

    ++j; 

    printf(" i = %d j = %d\n", i, j); 

int main() 

    var(); 

    var(); 

    return 0; 

}


i = 21 j = 21 

i = 21 j = 22


i 는 auto 변수 이므로 블록을 나갔다가 다시 돌아오면 계속 20으로 초기화 되지만 j 는 정적 변수 이므로 블록을 나갔다가 다시 돌아오면 이전에 가지고 있던 21을 가지게 되어 1증가하면 22가 됩니다. 


#include <stdio.h> 


void func2() 

    static int i = 0; 

    printf("func2() : %d\n", ++i); 

   

 

void func1() 

    static int i = 0; 

    printf("func1() : %d\n", ++i); 

   

 

int 

main(int argc, char *argv[]) 

    func1(); 

    func2(); 

    func1(); 

    func2(); 

    func1(); 

    func2(); 

    func1(); 

    func2(); 

   

 

    return 0; 

}


func1() : 1 

func2() : 1 

func1() : 2 

func2() : 2 

func1() : 3 

func2() : 3 

func1() : 4 

func2() : 4

   

 

   

 

8-6) 실습예제 (auto변수와 정적 변수의 차이를 알아보는 프로그램2) 


#include <stdio.h> 

int main() 

int i, j; 

for(j=1; j<4; j++) 

for(i=1; i<4; i++) 

static int n1 = 0; 

int n2 = 0; 

n1 = n1 + 10; 

n2 = n2 + 10; 

printf("j = %d i = %d ---> n1 = %d n2 = %d\n", j, i, n1, n2); 

    return 0; 

}


j = 1 i = 1 -à n1 = 10 n2 = 10 

j = 1 i = 2 -à n1 = 20 n2 = 10 

j = 1 i = 3 -à n1 = 30 n2 = 10 

j = 2 i = 1 -à n1 = 40 n2 = 10 

j = 2 i = 2 -à n1 = 50 n2 = 10 

j = 2 i = 3 -à n1 = 60 n2 = 10 

j = 3 i = 1 -à n1 = 70 n2 = 10 

j = 3 i = 2 -à n1 = 80 n2 = 10 

j = 3 i = 3 -à n1 = 90 n2 = 10


n1 은 static 변수이므로 이전 값에 계속 누적 시켜 가지만 n2 는 auto 이므로 매번 초기화 되어 계속 같은 값을 출력하게 됩니다.

반응형
Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]