Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- Virtual Byte
- Cartoon Rendering
- 메모리 누수
- URP
- C언어
- 3d
- 가상 바이트
- 벡터
- working set
- 프로그래밍 기초
- 개인 바이트
- ColorGradingLutPass
- Specular
- 작업 집합
- AppSW
- Cell Look
- ASW(Application SpaceWarp)
- Toon Shader
- Private Bytes
- Three(Two) Tone Shading
- OculusMotionVectorPass
- Cell Shader
- Windows Build
- Rim Light
- URP로 변경
- 게임 수학
- VR
Archives
- Today
- Total
WinCNT
C 언어 - 12. 컴퓨터가 변수를 처리하는 방법 본문
프로그램 메모리 주소
- 프로그램이 실행되기 위해서는 메모리에 적재(Lord)되어야 한다
- 즉 프로그램의 크기를 충당할 수 있을 만큼의 메모리 공간이 필요하다
- 일반적인 컴퓨터 OS(운영체제)는 메모리 공간을 이하의 4가지로 구분하여 관리한다
코드 영역 데이터 영역 힙 영역 스택 영역 소스 코드 전역 변수
정적 변수동적 할당 변수 지역 변수
매개 변수- 코드 영역 : 한 줄 한 줄 실행시킬 수 있는 소스 코드
- 데이터 영역 : 전역 변수, 정적 변수를 담고 있는 영역
- 힙 영역 : 동적 할당 변수를 담는 영역
- 스택 영역 : 함수마다 포함되어 있는 지역 변수, 매개 변수를 담는 영역
전역 변수(Global Variable)
- 프로그램의 어디서든 접근 가능한 변수
메모리의 데이터 영역에 적재된다 - main 함수가 실행되기도 전에 프로그램의 시작과 동시에 메모리에 할당된다
- 프로그램의 크기가 커질 수록 전역 변수로 인해 프로그램이 복잡해질 수 있다
#include<stdio.h>
//전역 변수
//main 함수의 바깥에 선언
int a = 5;
//전역 변수는 다른 함수에서도 바로 접근 가능
void changeValue()
{
a = 10;
}
int main(void)
{
printf("%d\n", a);
changeValue();
printf("%d\n", a);
system("pause");
return 0;
}
정적 변수(Static Variable)
- 특정한 블록에서만 접근 가능한 변수
메모리의 데이터 영역에 적대된다 - 프로그램이 실행될 때 메모리에 할당되며 프로그램이 종료되면 메모리에서 해제된다
즉, 전역 변수와 지역 변수의 특징을 모두 가진다고 할 수 있음
#include<stdio.h>
void process()
{
static int a = 5; //정적 변수 : 프로그램 실행 시 Lord됨
a = a + 1; //변수가 Lord되어 있으면 다시 Lord하지 않고 접근하여 연산함
printf("%d\n", a);
}
int main(void)
{
process(); //6
process(); //7
process(); //8
system("pause");
return 0;
}
지역 변수(Local Variable)
- 프로그램의 특정한 블록(Block)에서만 접근 가능한 변수
메모리의 스택 영역에 기록된다 - 함수가 실행될 때마다 메모리에 할당되며, 함수가 종료되면 메모리에서 해제된다
int main(void)
{
//main 함수 블록의 지역 변수
int LocalVar = 7;
if (1)
{
//if 블록의 지역 변수
int LocalVar = 5;
}
printf("%d\n", LocalVar); //7(main 함수 블록의 지역 변수가 출력)
system("pause");
return 0;
}
레지스터 변수(Register Variable)
- 메인 메모리 대신 CPU의 레지스터를 사용하는 변수
- 레지스터는 매우 한정되어 있으므로 실제로 레지스터에서 처리될지는 장담할 수 없다
(실제로 레지스터에서 처리될지 아닐지는 컴파일러가 담당하는 부분)
#include<stdio.h>
int main(void)
{
register int a = 10;
register int i;
for (i = 0; i < a; i++)
{
printf("%d ", i);
}
system("pause");
return 0;
}
함수의 매개 변수(Parameter)가 처리될 때
- 매개 변수(Parameter)란 함수를 호출할 때 함수에 필요한 데이터를 전달하는 변수를 뜻한다
- 전달 방식은 2가지 존재한다
- 값에 의한 전달 방식
값을 전달하는 방식으로 함수 내에서 새롭게 변수가 생성된다 - 참조에 의한 전달 방식
메모리 주소를 전달하는 방식으로 원래의 변수 자체에 접근이 가능하다
- 값에 의한 전달 방식
#include<stdio.h>
//값에 의한 전달 방식
//새롭게 두 변수가 메모리 내에 할당되어 처리됨(원래의 변수에 영향 없음)
void addVal(int a, int b)
{
a = a + b;
}
//주소에 의한 전달 방식
//함수의 매개 변수로 변수의 주소를 전달함(원래 변수에 접근 가능)
void addRef(int *a, int b)
{
*a = (*a) + b;
}
int main(void)
{
int a = 7;
addVal(a, 10); //값에 의한 전달 방식
printf("값에 의한 전달 방식 : %d\n", a); //7(변화 없음)
addRef(&a, 10); //주소에 의한 전달 방식
printf("주소에 의한 전달 방식 : %d\n", a); //17(원래 변수의 변화)
system("pause");
return 0;
}
'Study > C' 카테고리의 다른 글
C 언어 - 14. 동적 메모리 할당 (0) | 2021.09.09 |
---|---|
C 언어 - 13. 다차원 배열과 포인터 배열 (0) | 2021.09.08 |
C 언어 - 11. 문자열 (0) | 2021.09.05 |
C 언어 - 10. 문자 (0) | 2021.08.05 |
C 언어 - 09. 포인터 (0) | 2021.08.03 |