함수에 대해 본격적으로 공부한다는 것은 점점 더 구조적인 프로그램을 만든다는 것임.
변수의 영역과 지역 변수의 문법적인 측면을 살펴보자.
변수들은 변수들이 유효하고 사용가능한 영역이 따로 있다.
예제 코드를 보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int int_max(int i, int j);
int int_max(int i, int j)
{
int m;
m = i > j ? i : j;
return m;
}
int main()
{
int a;
a - int_max(1, 2);
printf("%d\\n", a);
printf("%p\\n", &a);
return 0;
}
위의 int_max()
함수 바디에서 선언된 변수int m
은 int_max()
의 중괄호 안에서만 볼 수 있고 사용가능하다. 볼수 있다는 의미는, visible하다고 표현함. 접근가능하다.
영역(Scope)는 중괄호’{}’로 묶인 문장의 집합임.
영역 안에서만 사용가능한 변수들, 즉 영역안에서 선언된 변수들을 지역변수(Local Variable)라고 하고, 그 반대인 전역변수(특히 파일변수, 해당 파일내에서 모두 사용가능한 변수)는 뒤에서 더 배울 것임.(중괄호 밖에서 선언된 변수들)
만약 전역변수와 지역변수의 이름이 같다면, 해당 지역변수가 선언된 영역 내에선 지역변수가 우선권을 가짐. 왜인지는 뒤에서 스택의 개념을 통해 살펴본다.
printf("%p\\n", &a);
에서 &a로 표현된건 무엇인가? 포인터의 개념을 통해 이해하자.
변수를 통해 접근하는건 메모리상의 실제 공간이고, 접근을 위해선 그 공간의 주소가 필요하다. 이 주소를 우리가 이용해먹을 수 없는가? &a를 이용하면 변수 a의 주소를 지칭하게 된다. 참고로 &(ampersand)는 주소를 가리키는 연산자임.
printf()에서 변수앞에 &를 붙이면 그 변수의 주소값을 직접 출력해준다. 이때 형식지정자는 %p임.
main함수 내에 새로운 변수가 선언되지 않은 다른 영역들을 만들어보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int int_max(int i, int j);
int int_max(int i, int j)
{
int m; //stack frame
m = i > j ? i : j;
return m;
}
int main()
{
int a;
a = int_max(1, 2);
printf("%d\\n", a);
printf("%p\\n", &a);
{
a = int_max(4, 5);
printf("%d\\n", a);
printf("%p\\n", &a);
int b = 123;
}
printf("%d\\n", a);
printf("%p\\n", &a);
return 0;
}