ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C,C++] 변수의 종류(지역, 전역, 정적 ,레지스터)
    ETC/[C, C++] 2022. 4. 24. 23:55
    반응형

    지역변수

    1. 함수 내 시작 부분에서 선언
    2. 함수가 끝날 때까지 사용 가능
    3. 함수가 호출돼서 명령이 실행되면 메모리에 잡혔다가 함수가 반환될 때 사라짐.
    4. 자동 초기화는 되지 않고 쓰레기 값이 있음.
    int main(){
        int a=3, b=8;
        printf("%d, %d\n",a,b);//3 8
        {//지역변수 temp 설정
        	int temp;
            temp=a;
            a=b;
            b=temp;
        }
        printf("%d, %d\n",a,b);//8 3
        return 0;
    }

    두 값을 바꾸려고 {} 안에서 temp라는 변수를 임시적으로 사용하는 모습. 

     

    전역 변수

    1. 함수 바깥에서 선언, 프로그램 시작할 때 저장공간 확보되고, 끝날 때 저장공간 사라짐.
    2. 선언하면 자동으로 0으로 초기화됨.
    3. 모든 함수들이 자유롭게 데이터 공유

    단점

    프로그램 오류가 생겼을 때 전역 변수가 들어간 모든 함수를 수정해야하므로 전역변수 사용을 지양하자.
    여러 사람이랑 작업할 때 지역변수명이랑 겹치는 불상사가 일어날 수도 있음.

     

    정적 지역변수

    1. 함수 안에다 선언하는 전역 변수다.
    2. 프로그램 시작할 때 저장공간 확보되고 끝날 때 사라지고, 마찬가지로 자동으로 0으로 초기화된다.
    3. 다만 범위가 그 함수 안으로 제한이 되고, 함수가 호출돼서 반환이 돼도 메모리는 그대로 값을 저장하고 있다.
    void static_func(){
        static int a=0;
        a++;
        printf("%d ",a);
    }
    int main(){
        int i;
        for(int i=0;i<5;i++){
        	static_func();//1 2 3 4 5
        }
        return 0;
    }

    레지스터 변수

    1. 지역변수에만 register을 붙일 수 있는데 일반 지역변수는 저장공간으로 메모리를 쓰는 반면에 레지스터 변수는 cpu안에 있는 저장공간(레지스터)을 사용한다.
    2. 하지만, cpu 한 부분을 반복문만 돌리거나 하는 데 사용하면 굉장히 비효율적이기 때문에 컴파일러가 알아서 레지스터 변수를 선언 안 해도 사용하기도 하고, 선언해도 사용 안 하기도 한다.
    3. 레지스터 변수는 메모리에 저장된 게 아니기 때문에 주소 연산자(&)를 쓰면 안 된다.
    반응형
Designed by Tistory.