2021. 1. 5. 13:18ㆍ프로그래밍 공부/C 공부
[지역변수]
C언어에서 하나의 함수, 즉 {} 안에 선언된 변수를 의미한다.
지역변수는 해당 함수안에서만 유효하다.
main 함수 안에 선언된 a 변수가 그 예이다.
void main()
{ int a = 0 ; }
- 특징
지역변수는 서로다른 함수들끼리 이름을 중복하여 사용할 수 있다.
[전역변수]
C언어에서 함수에 선언되지 않고 헤더라인쪽에 선언된 변수를 의미한다.
아래의 변수 a가 그 예이다.
#include <stdio.h>
int a = 0;
void main() {....}
-특징
전역변수와 동일한 이름으로 지역변수로 재정의한경우 : 이름이 같을때 지역변수가 먼저 처리되므로 var1 + var2 값은 지역변수 result에 저장되고, 전역변수 result에는 어떤 변화도 생기지 않는다. main은 전역변수 result를 출력하므로 결과값은 0이 나오게된다.
#include <stdio.h>
int result = 0; // (1)전역변수 생성
void Sum(int var1, int var2); // (2)Sum함수 선언
void main()
{
Sum(5, 3); //(3)Sum함수 호출
printf("%d", result); // (5)결과값은 무조건 0 출력
}
void Sum(int var1, int var2)
{
int result; // (4)Sum함수 result 재정의(지역변수화)
result = var1 + var2;
}
이러한 특징때문에 지역변수는 프로그램의 이식성을 떨어트리므로 꼭 필요한 경우가 아니면 사용하지 않는게 좋다.
[extern 키워드:전역변수 참조]
같은 프로젝트안에 있는 전역변수를 참조하도록 해주는 키워드이다. 전역변수가 선언되지 않은 소스코드에서 전역변수가 필요할때 사용된다.
sum.c 에 전역변수 reult 가 선언된 상태에서 main.c 에서는 해당 전역변수를 참조해야할때 아래와 같이 사용한다.
//.....
extern int result ;
void main () {...}
[static 키워드:전역변수 사용범위 제한]
C에서 전역변수의 사용범위는 프로그램 전체이다. 이러한 이유로 다른 사람의 라이브러리를 가져와서 사용할때 오류가 발생하기도 하는데, 이 범위를 제한함으로써 오류를 방지할 수 있다.
sum.c 의 전역변수 result를 static int result ; 로 선언하면 main.c 에서 result로 전역변수를 만들더라도 링크할때 아무런 오류가 발생하지 않는다. sum에서 선언된 전역변수 result의 사용범위는 sum.c 소스코드로 한정되었기 때문이다.
static으로 제한된 전역변수는 extern으로도 참조되지 않는다.
또한 지역변수에 static을 활용할 수 있는데
# include <stdio.h>
void tmp()
{
static int bin = 0;
printf("%d\n",bin++);
}
void main()
{
int i;
for(i=0 ; i <=5 ; i++){tmp()};
}
이 코드에서 tmp 함수 bin변수에 static이 없으면 출력값은 항상 0이 되었을 것이다.
하지만 static으로 지역변수를 전역변수화 시켰고 자신이 가지고 있는 값을 유지하게 되어 1,2,3,4,5를 출력하게 된다.
[const 키워드 : 이 변수는 건드리지마]
특정 변수를 상수로 인식시켜 시켜 변경할 경우 문법 오류가 나타나도록 하는 키워드
컴파일할때 문법적 오류를 알려주기 위한 기능으로 변수의 속성 자체를 바꾸는 것은 아님
//.......
int GetArea(const double pi, double radius, int limit)
{
double result ;
pi = 3.14;
result = pi * radius * radius;
return result;
}
이 예시에서 pi 값은 변경하면 안되지만 누군가 실수로 변경할 수 있으므로, pi값이 변경되면 오류가 나도록하는 const 키워드를 변수에 추가하였음.
'프로그래밍 공부 > C 공부' 카테고리의 다른 글
[C] void 포인터 (0) | 2021.01.06 |
---|---|
[C] 포인터 활용 (0) | 2021.01.06 |
[C] 포인터 개념 (0) | 2021.01.06 |
[C] if 조건문 (0) | 2021.01.05 |
[C] 저장공간 할당 (0) | 2021.01.05 |