C
C언어에서 변수를 처리하는 방법
에드장
2021. 2. 10. 09:55
프로그램 메모리 주소
코드 영역 | 데이터 영역 | 힙 영역 | 스택 영역 |
소스 코드 | 전역 변수 정적 변수 |
동적 할당 변수 | 지역 변수 매개 변수 |
전역 변수(Global Variable)
어디서든 접근 가능한 변수
main 함수가 실행되기 전에 프로그램의 시작과 동시에 메로리에 할당됩니다
프로그램의 크기가 커질 수록 전역 변수로 인해 프로그램이 복잡해질 수 있습니다
메모리의 데이터 영역에 적재됩니다
전역 변수를 활용한 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <stdio.h>
int a = 5;
void changevalue() {
a = 10;
}
int main(void) {
printf("%d\n", a);
changevalue();
printf("%d\n", a);
system("pause");
return 0;
}
|
cs |
지역 변수(Local Variable)
특정한 블록(Block)에서만 접근할 수 있는 변수를 말합니다
함수가 실행될 때마다 메모리에 할당되어 함수가 종료되면 메모리에서 해제됩니다
메모리의 스택 영역에 기록됩니다
지역변수를 활용한 예시
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <stdio.h>
int main(void) {
int a = 7;
if (1) {
int a = 5;
}
printf("%d\n", a);
system("pause");
return 0;
}
|
cs |
블록 안에서 선언된 int a = 5 는 블록안에서만 사용됩니다
정적 변수(Static Variable)
특정한 블록에서만 접근할 수 있는 변수
프로그램이 실행될 때 메모리에 할당되어 프로그램이 종료되면 메모리에서 해제됩니다
메모리의 데이터 영역에 적재됩니다
정적 변수를 활용한 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <stdio.h>
void process() {
static int a = 5;
a = a + 1;
printf("%d\n", a);
}
int main(void) {
process();
process();
process();
system("pause");
return 0;
}
|
cs |
레지스터 변수(Register Variable)
메인 메모리 대신 CPU의 레지스터를 사용하는 변수
레지스터는 매우 한정되어 있으므로 실제로 레지스터에서 처리될 지는 장답할 수 없습니다
레지스터 변수를 활용한 예시
1
2
3
4
5
6
7
8
9
10
11
|
#include <stdio.h>
int main(void) {
register int a = 10, i;
for (i = 0; i < a; i++) {
printf("%d ", i);
}
system("pause");
return 0;
}
|
cs |
함수의 매개변수가 처리될 때 두 가지 방법이 있습니다
1.값에 의한 전달 방식(단지 값을 전달하므로 함수 내에서 변수가 새롭게 생성됩니다.)
2.참조에 의한 전달 방식(주소를 전달하므로 원래의 변수 자체에 접근할 수 있습니다.)
값에 의한 전달 방식(ADD 함수)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <stdio.h>
void add(int a, int b) {
a = a + b;
printf("%d\n", a);
}
int main(void) {
int a = 7;
add(a, 10);
printf("%d\n", a);
system("pause");
return 0;
}
|
cs |
참조에 의한 전달 방식(ADD함수)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h>
void add(int *a) {
*a = (*a) + 10;
}
int main(void) {
int a = 7;
add(&a);
printf("%d\n", a);
system("pause");
return 0;
}
|
cs |
매개변수로 포인터 변수를 보냅니다
위와 같이 함수에 데이터를 전달하는 방법은
값을 전달하는 방식과
주소를 전달하는 방식 두가지가 있습니다.