-
[C,C++] 변수의 종류(지역, 전역, 정적 ,레지스터)ETC/[C, C++] 2022. 4. 24. 23:55반응형
지역변수
- 함수 내 시작 부분에서 선언
- 함수가 끝날 때까지 사용 가능
- 함수가 호출돼서 명령이 실행되면 메모리에 잡혔다가 함수가 반환될 때 사라짐.
- 자동 초기화는 되지 않고 쓰레기 값이 있음.
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라는 변수를 임시적으로 사용하는 모습.
전역 변수
- 함수 바깥에서 선언, 프로그램 시작할 때 저장공간 확보되고, 끝날 때 저장공간 사라짐.
- 선언하면 자동으로 0으로 초기화됨.
- 모든 함수들이 자유롭게 데이터 공유
단점
프로그램 오류가 생겼을 때 전역 변수가 들어간 모든 함수를 수정해야하므로 전역변수 사용을 지양하자.
여러 사람이랑 작업할 때 지역변수명이랑 겹치는 불상사가 일어날 수도 있음.정적 지역변수
- 함수 안에다 선언하는 전역 변수다.
- 프로그램 시작할 때 저장공간 확보되고 끝날 때 사라지고, 마찬가지로 자동으로 0으로 초기화된다.
- 다만 범위가 그 함수 안으로 제한이 되고, 함수가 호출돼서 반환이 돼도 메모리는 그대로 값을 저장하고 있다.
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; }
레지스터 변수
- 지역변수에만 register을 붙일 수 있는데 일반 지역변수는 저장공간으로 메모리를 쓰는 반면에 레지스터 변수는 cpu안에 있는 저장공간(레지스터)을 사용한다.
- 하지만, cpu 한 부분을 반복문만 돌리거나 하는 데 사용하면 굉장히 비효율적이기 때문에 컴파일러가 알아서 레지스터 변수를 선언 안 해도 사용하기도 하고, 선언해도 사용 안 하기도 한다.
- 레지스터 변수는 메모리에 저장된 게 아니기 때문에 주소 연산자(&)를 쓰면 안 된다.
반응형'ETC > [C, C++]' 카테고리의 다른 글
[C,C++] 포인터 배열 (0) 2022.04.30 [C,C++] C에서 함수의 데이터 전달 방법(Call-by-Value, Call-by-Reference) (0) 2022.04.25 [C,C++] 문자열 함수(strcpy, strncpy, strlen, strcat, strncat, strcmp, strncmp) (0) 2022.04.22 [C,C++] 문자열과 포인터 (0) 2022.04.22 Hello World! (0) 2022.04.22