FastCampus All-In-One 패키지 중 C/C++ 수업을 듣고 정리한 자료입니다.
실행환경: Windows 10
학습목표
- C언어에서 다양한 변수를 처리하는 방법을 공부
- 지역 변수, 전역 변수, 레지스터 변수 등을 학습
- 특정한 함수에 값을 전달하거나 주소를 전달하는 방법을 이해
프로그램 메모리 주소
- 컴퓨터에서 프로그램이 실행되려면 프로그램이 메모리에 적재(Load)되야 함
- 따라서, 프로그램 크기를 충당할 수 있을 정도의 메모리 공간이 필요
- 일반적인 컴퓨터 운영체제에서 메모리 공간은 4가지로 구분하여 관리
전역변수(Global Variable)
- 프로그램의 어디서든 접근 가능한 변수
- main 함수가 실행되기 전에 프로그램의 시작과 동시에 메모리에 할당
- 프로그램 크기가 커질 수록 전역 변수로 인해 프로그램이 복잡해질수 있다
- 메모리의 데이터(Data) 영역에 적재됨
전역변수 예시
#include <stdio.h>
int a = 5;
int changeValue() {
a = 10;
}
int main(void) {
printf("%d\n", a);
changeValue();
printf("%d\n", a);
system("pause");
return 0;
}
int a = 5;
가 전역변수changeValue()
나main()
어디로든 접근이 가능하다
결과
5
10
계속하려면 아무 키나 누르십시오 . . .
지역변수(Local Variable)
- 특정한 블록(Block)에서만 접근할 수 있는 변수
- 함수가 실행될 때마다 메모리에 할당되어 함수가 종료되면 메모리에서 해제
- 메모리의 스택(Stack)영역에 기록
지역변수 예시
#include <stdio.h>
int main(void) {
int a = 7;
if(1) {
int a = 5;
}
printf("%d\n", a);
system("pause");
return 0;
}
- 블록은 총 2개
- main함수와 if문
- 프린트하는 a와 같은 블록에 있는건
int a = 7;
이기 때문에 7이 출력
결과
7
계속하려면 아무 키나 누르십시오 . . .
정적변수(Static Variable)
- 특정한 블록(Block)에서만 접근할 수 있는 변수
- 프로그램이 실행될 때 메모리에 할당되어 프로그램이 종료되면 메모리에서 해제
- 메모리의 데이터(Data)영역에 적재
정적변수 예시
#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;
}
- 프로그램 최초 실행시
static int a = 5;
가 적재가 되고 - 이후 아래에
a = a + 1;
이 실행되어서 최초값은 6 - 그 이후에는
process()
를 호출할 때 마다 static int a = 5;
는 무시하고a = a + 1
만 수행
결과
6
7
8
계속하려면 아무 키나 누르십시오 . . .
레지스터 변수(Register Variable)
- 메인 메모리 대신 CPU의 레지스터를 사용하는 변수
- 매우 한정되어 있으므로 실제로 레지스터에서 처리될 지는 장담할수 없음
레지스터 변수 예시
#include <stdio.h>
int main(void) {
register int a = 10, i;
for (i = 0; i < a; i++) {
printf("%d", i);
}
system("pause");
return 0;
}
register int a = 10
이 레지스터 변수 선언 부분- 일반 변수보다 더 빠르게 처리될거라는 기대감을 가질수 있다
결과
0 1 2 3 4 5 6 7 8 9 계속하려면 아무 키나 누르십시오 . . .
함수의 매개변수가 처리될 때
- 함수를 호출할 때 함수에 필요한 데이터를 매개변수로 전달한다
- 전달방식은
값에 의한 전달
과참조에 의한 전달
방식이 있다 값에 의한 전달
- 단지 값을 전달하므로 함수 내에서 변수가 새롭게 생성됨참조에 의한 전달
- 주소를 전달하므로 원래의 변수 자체에 접근할 수 있음
값에 의한 전달 방식(ADD 함수)
- ADD 함수로 2개의 값을 넣으면 새롭게 두 변수가 메모리 내에 할당되어 처리
- 따라서, 원래 변수의 값에는 영향을 미치지 못한다.
예시
#include <stdio.h>
void add(int a, int b) {
a = a + b;
}
int main(void) {
int a = 7;
add(a, 10);
printf("%d\n", a);
system("pause");
return 0;
}
main()
함수에서는a
에 7이라는 값이 담겨져 있고add()
함수의 결과 값은 포함이 되지 않기 때문에 결과가 7이 됨.add(a, 10)
의 결과 값을 보려면 add 함수안에 printf를 해야함
결과
7
계속하려면 아무 키나 누르십시오 . . .
참조에 의한 전달 방식(ADD 함수)
- 함수의 매개변수로 변수의 주소를 전달한다
- 따라서, 원래 변수의 값에 접근하여 값을 변경할수 있다.
- 매개변수로 “포인터(Pointer)”변수를 보낼뿐 특별한것은 없다
예시
#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;
}
결과
17
계속하려면 아무 키나 누르십시오 . . .
요약
- C언어에서는 전역 변수, 지역 변수 등 다양한 종류의 변수가 사용된다.
- 함수에 데이터를 전달하는 방법은 두 가지가 있다
값을 전달하는 방식
주소를 전달하는 방식
Comments