Develop
2003.04.23 10:56

[c] 스토리지 클래스(변수)

Views 8197 Votes 0 Comment 0
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
변수의 스코프(scope): 변수가 프로그램내에서 사용될 수 있는 범위
변수의 라이프타임(lifetime): 변수가 존재하는 시간(기간)
스토리지 클래스(storage class): 스토리지 클래스는 변수의 스코프와 라이프타임을 결정한다.

스토리지 클래스 종류
1. extern : 전역변수 
        스코프: 프로그램 전체
        라이프타임: 프로그램이 실행되는 모든 시간

2. auto: 지역 변수
        스코프: 변수가 선언된 블락이나 함수
        라이프타임: 변수가 선언된 함수나 블락이 실행되는 동안

3. static: 정적 변수
        스코프: 변수가 선언된 블락이나 함수
        라이프타임: 프로그램이 실행되는 모든 시간 동안

4. register: 레지스터 변수, 프로그램의 최적화를 위해 사용된다.
        스코프: auto와 동일
        라이프타임: auto와 동일

*변수는 정의되기 전에 사용될 수 없다.

예제: storage.c
     1  #include <stdio.h>
     2
     3  int  extern_int = 10;
     4
     5  int add(int a, int b) {
     6      auto    int  auto_int;
     7      static  int  static_int;
     8
     9      auto_int = a + b + extern_int;
    10      static_int +=  auto_int;
    11      printf("tadd::auto_int = %dn", auto_int);
    12      printf("tadd::static_int = %dn", static_int);
    13      return auto_int;
    14  }
    15
    16  main(int argc, char ** argv) {
    17      register  int  i, sum = 0;
    18      auto      int  d;
    19
    20      for(i=0; i < 5; i++) {
    21          d = i*i;
    22          extern_int++;
    23          sum += add(i, d);
    24          printf("n");
    25      }
    26      printf("sum = %d n", sum);
    27  }

결과
#7 enterprise:/data1/student/c9844000% storage
        add::auto_int = 11
        add::static_int = 11

        add::auto_int = 14
        add::static_int = 25

        add::auto_int = 19
        add::static_int = 44

        add::auto_int = 26
        add::static_int = 70

        add::auto_int = 35
        add::static_int = 105

sum = 105 


예제: storage2.c
     1  #include <stdio.h>
     2
     3  int  value = 10;
     4
     5  main(int argc, char ** argv) {
     6      register  int  i;
     7
     8      printf("value = %dn", value);
     9      for(i=0; i < 5; i++) {
    10          int value = 20;
    11          if(i == 2) {
    12              int value = 30;
    13              printf("ttvalue = %dn", value);
    14          } else {
    15              printf("tvalue = %dn", value);
    16          }
    17      }
    18      printf("value = %dn", value);
    19  }


결과
#15 enterprise:/data1/student/c9844000% storage2
value = 10
        value = 20
        value = 20
                value = 30
        value = 20
        value = 20
value = 10

예제: storage3.c
     1  #include <stdio.h>
     2
     3  int  value = 10;
     4
     5  main(int argc, char ** argv) {
     6      register  int  i;
     7
     8      printf("value = %dttt:&value = %pn", value, &value);
     9      for(i=0; i < 5; i++) {
    10          int value = 20;
    11          if(i == 2) {
    12              int value = 30;
    13              printf("ttvalue = %dt:&value = %pn", value, &value);
    14          } else {
    15              printf("ttvalue = %dt:&value = %pn", value, &value);
    16          }
    17      }
    18      printf("value = %dttt:&value = %pn", value, &value);
    19  }

결과
#22 enterprise:/data1/student/c9844000% storage3
value = 10                      :&value = 20b08
                value = 20      :&value = effffa38
                value = 20      :&value = effffa38
                value = 30      :&value = effffa34
                value = 20      :&value = effffa38
                value = 20      :&value = effffa38
value = 10                      :&value = 20b08


예제: storage4.c
     1  #include <stdio.h>
     2
     3  int  value = 10;
     4
     5  main(int argc, char ** argv) {
     6      register  int  i;
     7
     8      printf("value = %dttt:&value = %pn", value, &value);
     9      for(i=0; i < 5; i++) {
    10          static int value = 20;
    11          if(i == 2) {
    12              int value = 30;
    13              printf("ttvalue = %dt:&value = %pn", value, &value);
    14          } else {
    15              printf("ttvalue = %dt:&value = %pn", value, &value);
    16          }
    17      }
    18      printf("value = %dttt:&value = %pn", value, &value);
    19  }

결과
#28 enterprise:/data1/student/c9844000% storage4
value = 10                      :&value = 20b10
                value = 20      :&value = 20b14
                value = 20      :&value = 20b14
                value = 30      :&value = effffa38
                value = 20      :&value = 20b14
                value = 20      :&value = 20b14
value = 10                      :&value = 20b10


예제: storage5.c
     1  #include <stdio.h>
     2
     3  int  value = 10;
     4
     5  main(int argc, char ** argv) {
     6      register  int  i, sum = 0;
     7
     8      printf("sum = %dttt:&sum = %pn", sum, &sum);
     9      printf("value = %dttt:&value = %pn", value, &value);
    10      for(i=0; i < 5; i++) {
    11          static int value = 20;
    12          if(i == 2) {
    13              int value = 30;
    14              printf("ttvalue = %dt:&value = %pn", value, &value);
    15          } else {
    16              printf("ttvalue = %dt:&value = %pn", value, &value);
    17          }
    18      }
    19      printf("value = %dttt:&value = %pn", value, &value);
    20  }

컴파일
#32 enterprise:/data1/student/c9844000% cc -o storage5 storage5.c
"storage5.c", line 8: cannot take address of register: sum

#34 enterprise:/data1/student/c9844000% gcc -o storage5 storage5.c
storage5.c: In function `main':
storage5.c:8: warning: address of register variable `sum' requested


예제: storage6.c
     1  #include <stdio.h>
     2
     3  int  extern_int = 10;
     4  extern int add(int, int);
     5
     6  main(int argc, char ** argv) {
     7      register  int  i, sum = 0;
     8      auto      int  d;
     9
    10      for(i=0; i < 5; i++) {
    11          d = i*i;
    12          extern_int++;
    13          sum += add(i, d);
    14          printf("n");
    15      }
    16      printf("sum = %d n", sum);
    17  }
    18
    19  int add(int a, int b) {
    20      auto    int  auto_int;
    21      static  int  static_int;
    22
    23      auto_int = a + b + extern_int;
    24      static_int +=  auto_int;
    25      printf("tadd::auto_int = %dn", auto_int);
    26      printf("tadd::static_int = %dn", static_int);
    27      return auto_int;
    28  }

결과
#37 enterprise:/data1/student/c9844000% storage6
        add::auto_int = 11
        add::static_int = 11

        add::auto_int = 14
        add::static_int = 25

        add::auto_int = 19
        add::static_int = 44

        add::auto_int = 26
        add::static_int = 70

        add::auto_int = 35
        add::static_int = 105

sum = 105 


예제: storage7.c 
     1  #include <stdio.h>
     2
     3  int  value = 10;
     4
     5  main(int argc, char ** argv) {
     6      register  int  i;
     7      int       value = 20;
     8
     9      printf("value = %dn", value);
    10      for(i=0; i < 5; i++) {
    11          extern int value;
    12          if(i == 2) {
    13              int value = 30;
    14              printf("ttvalue = %dn", value);
    15          } else {
    16              printf("tvalue = %dn", value);
    17          }
    18      }
    19      printf("value = %dn", value);
    20  }

결과
#45 enterprise:/data1/student/c9844000% storage7
value = 20
        value = 10
        value = 10
                value = 30
        value = 10
        value = 10
value = 20

?

List of Articles
No. Category Subject Author Date Views
713 Develop [c++] 기초강좌 #04(클래스) hooni 2003.04.23 11832
712 Develop [c++] 더블 링크리스트(linked list) 학습용 초간단 단어장 file hooni 2003.04.23 9323
711 Develop [c++] 데이터 압축 프로그램 소스 (lzw) file hooni 2013.04.23 9935
710 Develop [c++] 디렉토리 내의 파일 찾기 FindFirstFile() 함수 6 hooni 2013.04.23 20573
709 Develop [c++] 레지스트리 등록 예제 1 file hooni 2013.04.23 8787
708 Develop [c++] 레지스트리 편집하는 부분..ㅡㅡ; file hooni 2013.04.23 8273
707 Develop [c++] 링크리스트(linked list) 클래스(스택,큐) file hooni 2003.04.23 9553
706 Develop [c++] 마방진 소스코드 file hooni 2013.04.23 9558
705 Develop [c++] 문자열 뒤집기(문자열 거꾸로 출력) hooni 2013.04.23 17285
704 Develop [c++] 바탕화면 테두리에 자석처럼 붙는 스냅효과.. file hooni 2013.04.23 8902
703 Develop [c++] 소켓 프로그래밍 관련 링크.. (퍼올려고 올린거) hooni 2013.04.23 7029
702 Develop [c++] 쓰레드(Thread) 객체의 사용 hooni 2013.04.23 8576
701 Develop [c++] 압축프로그램(Lite Zip) 샘플 file hooni 2013.04.23 8603
700 Develop [c++] 웹폼(webform)전송과 http 파일 업로드 샘플 file hooni 2013.04.23 33070
699 Develop [c++] 윈도우 API 정복 예제 file hooni 2013.04.23 7608
698 Develop [c++] 윈도우 프로세스뷰어 분석.. ㅋㅋ file hooni 2013.04.23 8836
Board Pagination Prev 1 ... 7 8 9 10 11 ... 53 Next
/ 53