일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 대림디움 대림바스플랜 PL-3070 탑카운터형 세면대/욕실/화장실/세면도기
- 미네 리빙다이닝 6인 원목 코너형 식탁세트(소파형)
- 러버메이드 벤티드 브루트(75L) 원형 컨테이너 리빙박스
- ipTIME 유무선공유기
- 8052 블랙라인 정사각 세면기
- 리빙앤트리 펠리컨 박스 대
- ChatGPT
- 22FW 로고 패치 포켓 체크 셔츠 2F000 03 M2359 F41
- 올리비아 스텐 세면대 세트
- 22FW 이바나 빈티지 체크 셔츠 더스트핑크 8054631
- 더블탭스 22SS 정글 01 셔츠 WTAPS JUNGLE 01 GREIGE M
- 잡잡 NBR 요가매트 스탠다드 운동매트 10mm 퍼플
- 샤오미 미밴드 7 스마트밴드
- list #pop #remove #del #append #insert #list형 #파이썬 파이썬 기본 문법 #파이썬 list
- [제이앤제나] 허리에 무리없는 신생아부터 역류방지쿠션_앨리펀블루 역류방지쿠션
- 남쪽나무 세면대 세면대 세트 (스마트거울) 벽걸이세면대 이케아세면대 세면기
- 삼성 갤럭시워치5
- 네스파 다야몬드은박 후드티
- 굿아이템 양면오픈형 투명 접이식 리빙박스 폴딩박스 옷정리함 수납박스 펜트리수납함
- 오토비 AZ100TR 32G 전후방 FHD 2채널 트럭 화물차 전용 블랙박스 보증기간 2년 20m케이블 포함 후방 적외선 방수 AS 2년보장
- 코멧 접이식 투명 리빙박스 56L 대형 2개입
- 23SS 스트라이프 오버핏 셔츠 723033 V2L30 9066
- 두칸 프릴 오버핏 후드티
- 1개
- 톰브라운 명품톰브라운 23SS 더블페이스 니트 아우터형 포켓 셔츠 MJT291A 07545 415
- 긍정
- 봄봄 골드라인 4023G 탑볼세면대 화이트골드 카운타 도기볼 카페세면대
- 반스 올드스쿨 VN000D3HY28
- 내셔널지오그래픽 피너스 빅로고 라운드넥 긴팔 티셔츠 카본 블랙
- 위드리빙 대용량 옷 수납 방수 바구니
- Today
- Total
냥집사의 개발일지
C언어 - 변수의 종류 본문
안녕하세요~ 오늘은 C언어에서 변수의 종류에 대해 알아보겠습니다.
C언어에서의 변수의 종류는 아래 4가지가 대표적인데요!
차례대로 정리해보겠습니다.
1. 지역변수
2. 전역 변수
3. 정적 변수
4. 레지스터 변수
1. 지역변수
아래 코드에서 value라는 변수를 각각 다른 함수에서 정의했을 때 다른 함수에 영향을 주는지 알아보겠습니다.
#include<stdio.h>
void random_func(){
int value = 7;
printf("value in random_func : %d\n",value);
}
int main(){
int value = 3;
random_func();
printf("value in main_func : %d\n",value);
return 0;
}
아래 결과와 같이 random_func 함수 안에 value는 7이고 main 함수 안에 value는 3으로
value 변수가 각각 다른 함수에 정의되었지만 정의된 함수 이외의 곳에서는 영향을 주지 않는 것을 확인할 수 있습니다.
value 변수처럼 함수 안에서 자료형+변수 이름으로 선언된 변수는 지역변수라고 합니다.
Tips 지역변수는 선언된 함수 안에서만 사용할 수 있어서 디버깅에 유리하고
선언된 블록이 끝나면 저장공간이 메모리에서 사라짐으로 메모리를 효율적으로 사용할 수 있습니다.
* 동일한 지역변수가 하나의 함수에서 여러 번 선언될 수 있습니다.
(사실 현업 코드에서 이런 경우는 거의 없겠지만 알아두면 좋을 것 같습니다~)
#include<stdio.h>
int main(){
int value = 3;
printf("value in First block : %d\n",value);
{
int value = 4;
printf("value in Second block : %d\n",value);
{
int value = 5;
printf("value in Thrid block : %d\n",value);
}
}
return 0;
}
앞에서 지역변수는 선언된 함수 안에서만 사용할 수 있다고 했지만 정확히 말하면
선언된 블록 안에서만 사용할 수 있다고 할 수 있습니다.
2. 전역 변수
전역 변수의 특징
1. 지역변수와 다르게 특정 함수 안에서 선언되는 것이 아니라 그 이외의 지역에서 선언됩니다.
2. 프로그램의 시작과 동시에 메모리에 할당되어 프로그램이 끝날 때까지 메모리에 남아있습니다.
3. 초기화되지 않은 전역 변수는 메모리 BSS 영역에 할당되어 자동적으로 0으로 초기화됩니다.
4. 같은 이름의 지역 변수에 의해 사용 범위가 제한됩니다.
#include<stdio.h>
int value = 7;
void random_func(){
printf("value in random_func : %d\n",value);
}
int main(){
random_func();
printf("value in First block : %d\n",value);
{
int value = 4;
printf("value in Second block : %d\n",value);
{
int value = 5;
printf("value in Thrid block : %d\n",value);
}
}
return 0;
}
아래 결과에서도 알 수 있듯이 같은 이름의 지역 변수에 의해 사용 범위가 제한되어 Second, Third block에서는 지역변수 value 값이 출력되고 그 이외의 영역은 모두 전역 변수 value가 출력되는 것을 확인할 수 있습니다.
3. 정적 변수
1. 정적 변수는 static+자료형+변수 이름으로 선언할 수 있습니다.
2. 정적 변수는 메모리의 BSS 영역에 할당됨으로 0으로 초기화됩니다.
3. 프로그램이 시작될 때 메모리에 할당되어 프로그램이 끝날 때 메모리에서 사라집니다.
#include<stdio.h>
void local_func(){
int value = 0;
value++;
printf("value in local_func : %d\n",value);
}
void static_func(){
static int value;
value++;
printf("value in static_func : %d\n",value);
}
int main(){
local_func();
local_func();
local_func();
static_func();
static_func();
static_func();
return 0;
}
아래 결과와 같이 지역변수 value는 main함수에서 local_func이 끝나면서
메모리에서 사라지기 때문에 계속해서 1을 출력하였습니다.
하지만 정적변수 value는 프로그램이 끝날 때까지 메모리에서 사라지지 않으므로
value 값을 기억하여 static_func 함수가 호출될 때마다 value값에 1을 더해줄 수 있습니다.
4. 레지스터 변수
1. 레지스터 변수는 register+자료형+변수 이름으로 선언할 수 있다.
2. 레지스터 변수로 선언해도 레지스터 변수로 사용되는 여부는 컴파일러가 결정합니다.
3. 레지스터 변수는 말 그대로 레지스터에 할당되어 메모리의 주소는 구할 수 없습니다.
4. 전역 변수는 레지스터 변수로 선언할 수 없습니다.
5. 메모리보다 레지스터가 연산장치와의 데이터 공유가 빠르기에 레지스터 변수를 사용합니다.
아래 코드는 register 변수로 선언해서 연산 시와 지역 변수로 선언해서 연산 시의 속도 차이를 출력해보았습니다.
#include <stdio.h>
#include <time.h>
int main(){
clock_t s1,s2,e1,e2;
float r1,r2;
register int index1;
int index2;
int total1,total2;
s1 = clock();
for(index1=0; index1 < 1000000; index1++){
total1 += index1;
}
e1 = clock();
r1 = (float)(e1-s1)/CLOCKS_PER_SEC;
printf("register calc %.5f\n",r1);
s2 = clock();
for(index2=0; index2 < 1000000; index2++){
total2 += index2;
}
e2 = clock();
r2 = (float)(e2-s2)/CLOCKS_PER_SEC;
printf("local calc %.5f\n",r2);
return 0;
}
실행 시마다 실행시간이 다르게 나오긴 하지만 register 변수로 선언했을 때가 지역변수로 선언했을 때보다 0.001~0.002 정도 빠른 것을 확인할 수 있었습니다.
오늘은 C언어에서 변수의 종류에 대해 알아보았습니다.
아래 4가지 변수가 잘 정리되었다면 좋겠네요~
1. 지역 변수
2. 전역 변수
3. 정적 변수
4. 레지스터 변수
그럼 다음 포스팅에서 만나요 좋은 하루 보내세요~~
'C언어' 카테고리의 다른 글
C언어 - 다차원 배열(N dimensional array) (0) | 2022.09.14 |
---|---|
C언어 - 데이터 공유 (call by value, call by reference) (0) | 2022.09.13 |
C언어 - 배열 & 포인터 (array & pointer) (0) | 2022.09.11 |
C언어 - 포인터 (Pointer) : 포인터를 사용하는 이유 (1) (0) | 2022.09.10 |
C언어 - 포인터 (Pointer) : 포인터 & 주소 (0) | 2022.09.09 |