본문 바로가기
문법관련/C

13. 변수

by print_soo 2024. 7. 4.

[지역 변수(자유 변수)]

→ 일정 지역에서만 사용 가능한 변수

특징

  1. 지역 변수는 사용 범위가 블록 내부로 제한되므로 다른 함수에서는 사용할 수 없다.
  2. 지역 변수는 이름이 같아도 선언된 함수가 다르면 각각 독립된 저장 공간을 갖는다.

장점

  1. 메모를 효율적으로 사용한다.
    1. 지역 변수는 함수 내부에서 사용되기 때문에 함수가 반환되면 저장 공간을 계속 유지할 필요가 없다.
  2. 디버깅에 유리하다.
    1. 지역 변수는 값에 문제가 있을경우 수정하기 쉽다.
    주의할 점. 지역 변수가 할당된 저장 공간은 자동 초기화가 안되기때문에 쓰레기 값을 사용하지 않도록 주의해야한다.

[전역 변수]

→ 프로그램 전체에서 사용가능한 변수

→ 함수 밖에서 선언

#include <stdio.h>

assign10();
assign20();

int a; //1번 a

int main() {
    printf("a의 값1: %d\\n", a);
    
    assign10();

    assign20();

    printf("a의 값2: %d\\n", a);

    return 0;
}

assign10(){
    a = 10;
}
assign20(){
    int a; //2번 a
    a = 20;
}

위와 같은 상황에서 a는 최종적으로 어떤 값을 가질까? 10이다.

전역 변수와 같은 이름의 지역 변수

→ 전역 변수와 지역 변수의 이름이 같다면 지역 변수를 먼저 사용하게 된다. 즉 a = 20; 에서 a는 2번 a를 사용한다는 의미이다.

전역 변수의 문제점

  1. 전역 변수의 이름을 바꾸면 그 변수를 사용하는 모든 함수를 찾아서 수정해야한다.
  2. 전역 변수의 값이 잘못된 경우 접근 가능한 모든 함수를 의심해야한다.
  3. 코드 블록 내에 같은 이름의 지역 변수를 선언하면 거기서는 전역 변수를 사용할 수 없다.

[정적 지역 변수(static)]

→ 힘수 내부에 선언하는 전역 변수

[자동 변수]

#include <stdio.h>

void auto_func(void);

int main() {
    int i;
    for (i=0; i<5; i++){
        auto_func();
    }

    return 0;
}

void auto_func(void){
    auto int a = 0;
    a++;
    printf("%d", a);
}
//출력
//11111

[지역 변수]

#include <stdio.h>

void static_func(void);
// 여기서 a는 선언된 것과 같다.
int main() {
    int i;
    for (i=0; i<5; i++){
        static_func();
    }

    return 0;
}

void static_func(void){
    static int a = 0;
    a++;
    printf("%d", a);
}

//출력
//12345

모든 특징이 전역변수와 같지만 함수 내부에서 사용할 수 있다는 점은 다르다.

전역변수와 같기 떄문에 메모리 공간을 함수가 반환이 되어도 유지한다.

 

[사용하는 이유]

→ 함수를 반환해도 값을 메모리에 유지하고 싶을 때


[레지스터 변수]

→ cpu 내부에 있는 저장공간을 사용한다.

'문법관련 > C' 카테고리의 다른 글

14.2 포인터 배열  (0) 2024.08.07
14.1 다차원 배열  (0) 2024.08.07
12.2 문자열 연산함수  (0) 2024.06.27
12.1 문자열과 포인터  (0) 2024.06.26
11.3 getchar(), putchar()  (0) 2024.06.26