while (1): study();

[C언어] 변수의 종류 본문

학습/C, C++

[C언어] 변수의 종류

전국민실업화 2021. 12. 8. 22:08
728x90

1. 지역 변수(Local variable)

= 자동 변수(Auto variable)

#include <stdio.h>

void assign(void);

int main(void)
{
	auto int a = 0; # 지역변수 할당은 auto 예약어(생략 가능) 사용
    
    assign();
    printf("main 함수 a: %d\n", a); # 0을 반환
    
    return 0;
}
 
void assign(void)
{
	int a;
    
    a = 10;
    printf("assign 함수 a: %d\n", a); # 10을 반환
}

특징

  1. 사용 범위가 블록 내부로 제한되므로 다른 함수에서는 사용할 수 없다.
  2. 이름이 같아도 선언된 함수가 다르면 각각 독립된 저장공간을 갖는다.
  3. 메모리를 효율적으로 사용한다.
  4. 디버깅에 유리하다.
  5. 사용 가능한 변수가 둘 이상이면 가장 가까운 블록에 선언된 변수를 사용한다.

 

2. 전역 변수(Global variable)

 

#include <stdio.h>

void assign10(void);
void assign20(void);

int a; # 전역 컨텍스트에서 관리되는 변수

int main(void)
{
	printf("함수 호출 전 a : %d\n", a); # 기본값 0 출력
    
	assign10();
	assign20();
    
	printf("함수 호출 후 a : %d\n", a); # 20 출력
    
	return 0;
}

void assign10(void)
{
	a = 10;
}

void assign(void)
{
	a = 20;
}

특징

  1. 관리 및 디버깅이 어려움

 

3. 정적 지역 변수(Static variable)

#include <stdio.h>

void auto_func(void);
void static_func(void);

int main(void)
{
    int i;
    
    printf("일반 지역 변수(auto)를 사용한 함수\n");
    for (i = 0; i < 3; i++)
    {
    	auto_func(); # 1, 1, 1 출력
    }
    
    printf("정적 지역 변수(static)을 사용한 함수\n");
    for (i = 0; i < 3; i++)
    {
	static_func(); # 1, 2, 3 출력
    }
    
    return 0;
}

void auto_func(void)
{
    auto int a = 0;
    
    a++;
    printf("%d\n", a);
}

void static_func(void)
{
    static int a; # 초기화하지 않을 시 기본값 0
    
    a++;
    printf("%d\n", a);
}

특징

  1. 선언된 함수가 반환되더라도 그 저장 공간을 계속 유지한다
  2. 일반 지역 변수와 같이 사용 범위는 블록 내부로 제한된다.

 

4. 레지스터 변수(Register variable)

#include <stdio.h>

int main(void)
{
    register int i;
    auto int sum = 0;
    
    for (i = 1; i <= 10000; i++)
    {
    	sum += 1;
    }
    
    printf("%d\n", sum);
    
    return 0;
}

특징

  1. 사용횟수가 많은 변수를 레지스터에 할당하여 실행시간을 단축한다.
  2. 전역 변수는 레지스터 변수로 선언할 수 없다.
  3. 주소를 구할 수 없다.
  4. 레지스터 사용 여부는 컴파일러가 최종 결정한다.
728x90

'학습 > C, C++' 카테고리의 다른 글

성적 처리 프로그램  (0) 2021.12.14
소수 계산 프로그램  (0) 2021.12.13
프로필 교환 프로그램  (0) 2021.12.12
[C언어]특별한 포인터  (0) 2021.12.11
가로 세로의 합 구하기  (0) 2021.12.09
Comments