줘이리의 인생적기

C - 변수의 영역, 데이터 공유 본문

공부/C

C - 변수의 영역, 데이터 공유

줘이리 2020. 5. 21. 12:58
728x90

 

Index

  • 지역 변수
  • 전역 변수
  • 정적 지역 변수
  • 레지스터 변수
  • 값 전달 방법
  • 주소 전달 방법

 

1. 지역 변수

지역 변수는 일정 지역인 함수 내 범위에서 사용가능한 변수이므로 다른 함수에서는 사용할 수 없다.

auto예약어와 함께 선언 하지만 생략 가능하다.

지역 변수는 이름이 같아도 선언된 함수에 따라 저장 공간이 따로 갖습니다.

 

 

2. 전역 변수

함수 밖에서 선언하는 변수를 전역 변수라고 한다. 

사용 범위는 프로그램 전체이므로 함수로 제한되지 않는다.

 

문제점 ① 전역 변수 이름을 바꾸면 사용되는 변수를 모두 찾아 수정해야 한다.

문제점 ② 함수 내에 같은 이름의 지역 변수를 선언 시 그 영역에서는 전역 변수를 사용할 수 없다.

 

 

3. 정적 지역 변수

지역 변수와 static 예약어와 같이 선언하면 정적 지역 변수가 된다.

사용 범위가 블록 내부로 제한되지만, 저장 공간을 유지한다.

예제를 통해 지역변수와 차이점을 알아보자.

 

지역 변수와 정적 지역 변수의 차이 예제

#include <stdio.h>

void var(void);   
void static_var(void);  

int main(void)
{
	int i;

	printf("일반 지역 변수\n");
	for (i = 0; i < 3; i++)
	{
		var();
	}

	printf("정적 지역 변수\n");
	for (i = 0; i < 3; i++)
	{
		static_var();
	}

	return 0;
}

void var(void)
{
	int a = 0;       

	a++;                 
	printf("%d\n", a);   
}

void static_var(void)
{
	static int a;        

	a++;                 
	printf("%d\n", a); 
}

실행결과

 

 

4. 레지스터 변수

register 예약어와 함께 사용하는 변수를 레지스터 변수라고 한다.

가장 큰 특징은 저장 공간이 할당되는 위치에 있고, RAM이 아니라 CPU안에 있는 레지스터 저장 공간을 사용한다.

레지스터는 처리 속도가 가장 빠른 저장 공간이다.

 

주의점 ① : 전역 변수는 레지스터 변수로 선언 할 수 없다.

주의점 : 주소를 구할 수 없다.

 

 

5. 값 전달 방법

Call by value라고도 하며, 값을 복사해서 전달하는 방법이다.

목차 6번 주소 전달 방법과 비교하며 보자.

 

Call by value 예제

#include <stdio.h>

int add(int a);     

int main(void)
{
	int a = 5;

	a = add(a);          
	printf("a : %d\n", a);

	return 0;
}

int add(int a)    
{
	a = a + 10;      
	return a;
}

실행결과

 

 

6. 주소 전달 방법

Call by reference(Call by address)라고도 하며 함수를 호출할 때 변수의 주소를 전달해주는 방법이다.

 

Call by reference 예제

#include <stdio.h>

void add(int* pa);       

int main(void)
{
	int a = 10;

	add(&a);             
	printf("a : %d\n", a);  

	return 0;
}

void add(int* pa)        
{
	*pa = *pa + 10;         
}

실행결과

 

'공부 > C' 카테고리의 다른 글

C - 문자열(2)  (0) 2020.05.19
C - 문자열(1)  (0) 2020.05.18
C - 문자  (0) 2020.05.18
C - 포인터  (0) 2020.05.14
C - 배열  (0) 2020.05.14