'정적 변수'에 해당되는 글 2건

  1. 2020.12.07 컴퓨터가 변수를 처리하는 방법
  2. 2020.12.01 변수와 상수

프로그램 메모리 주소

- 컴퓨터에서 프로그램이 실행되기 위해서는 프로그램이 메모리에 적재(Load)되어야 함

- 당연히 프로그램의 크기를 충당할 수 있을 만큼의 메모리 공간이 있어야 함

- 일반적인 컴퓨터의 운영체제는 메모리 공간을 네 가지로 구분하여 관리함

 

코드 영역 - 소스코드

데이터 영역 - 전역 변수, 정적 변수

힙 영역 - 동적 할당 변수

스택 영역 - 지역 변수, 매개변수

 

전역 변수

- 전역 변수(Global Variable)란 프로그램의 어디서든 접근 가능한 변수

- main 함수가 실행되기도 전에 프로그램의 시작과 동시에 메모리에 할당됨

- 프로그램의 크기가 커질수록 전역 변수로 인해 프로그램이 복잡해질 수 있음

- 메모리의 데이터(Data) 영역에 적재됨

#include <stdio.h>
#include <stdlib.h>

int a = 5; // 전역 변수

void changeValue() {
    a = 10;
}

int main(void) {
    printf("%d\n", a);
    changeValue();
    printf("%d\n",a);
    system("pause");
    return 0;
}

 

지역 변수

- 지역 변수(Local Variable)란 프로그램에서 특정한 블록(Block)에서만 접근할 수 있는 변수를 말함

- 함수가 실행될 때마다 메모리에 할당되어 함수가 종료되면 메모리에서 해제됨

- 메모리의 스택(Stack) 영역에 기록됨

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int a = 7;
    if (1) {
        int a = 5;
    }
    printf("%d", a);
    system("pause");
    return <#expression#>;
}

 

정적 변수

- 정적 변수(Static Variable)란 특정한 블록에서만 접근할 수 있는 변수

- 프로그램이 실행될 때 메모리에 할당되어 프로그램이 종료되면 메모리에서 해제됨

- 메모리의 데이터(Data) 영역에 적재됨

#include <stdio.h>
#include <stdlib.h>

void proccess() {
    static int a = 5; // 변수 a가 메모리상에 적재됨
    a = a + 1; // process 함수를 불러올 때마다 a에 1을 더해 나감
    printf("%d\n", a); // 더해진 a값을 출력
}

int main(void) {
    proccess(); // 6
    proccess(); // 7
    proccess(); // 8
    system("pause");
    return 0;
}

 

레지스터 변수

- 레지스터 변수(Register Variable)란 메인 메모리 대신 CPU의 레지스터를 사용하는 변수

- 레지스터는 매우 한정되어 있으므로 실제로 레지스터에서 처리될지는 장담할 수 없음

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    register int a = 10, i; // 레지스터 변수로 int형 a를 만들어서 10값을 넣어주고, i 변수 추가
    for (i = 0; i < a; i++) { // i는 0부터 a까지 반복
        printf("%d ", i); // i 출력
    }
    system("pause");
    return 0;
}

 

 

함수의 매개변수가 처리될 때

- 함수를 호출할 때 함수에 필요한 데이터를 매개변수로 전달함

- 전달 방식은 <값에 의한 전달 방식>과 <참조에 의한 전달> 방식이 있음

- 값에 의한 전달 방식은 단지 값을 전달하므로 함수 내에서 변수가 새롭게 생성됨

- 참조에 의한 전달 방식은 주소를 전달하므로 원래의 변수 자체에 접근할 수 있음(비유하자면 전역 변수에 더 가까움)

 

값에 의한 전달 방식(ADD 함수)

- ADD 함수로 두 개의 값을 넣으면 새롭게 두 변수가 메모리 내에 할당되어 처리됨

- 따라서 원래 변수의 값에는 영향을 미치지 못함

#include <stdio.h>
#include <stdlib.h>

void add(int a, int b) {
    a = a + b;
} // 이 함수 안에서만 적용

int main(void) {
    int a = 7;
    add(a, 10);
    printf("%d\n", a);
    system("pause");
    return 0;
}

 

참조에 의한 전달 방식(ADD 함수)

- 참조에 의한 전달 방식은 함수의 매개변수로 값을 전달하는 것이 아니라 변수의 조소(포인터 값)를 전달함

- 이러한 방식을 이용하면 원래 변수의 값에 접근하여 값을 변경할 수 있음

- 참조에 의한 전달 방식은 단지 매개변수로 포인터(Pointer) 변수를 보낼 뿐 딱히 특별한 게 아님

#include <stdio.h>
#include <stdlib.h>

void add(int *a) {
    (*a) = (*a) + 10; // 주소값 자체에 10을 더함
}

int main(void) {
    int a = 7;
    add(&a); // a의 주소값을 불러옴
    printf("%d\n", a);
    system("pause");
    return 0;
}

 

 

- C언어에서는 전역 변수, 지역 변수 등의 다양한 종류의 변수가 사용됨

- 함수에 데이터를 전달하는 방법은 값을 전달하는 방식과 주소를 전달하는 방식 두 가지가 있음

 

'C언어' 카테고리의 다른 글

동적 메모리 할당  (0) 2020.12.08
다차원 배열과 포인터 배열  (0) 2020.12.07
문자열  (0) 2020.12.05
문자  (0) 2020.12.04
포인터  (0) 2020.12.04
Posted by khon98
,

변수와 상수

C언어 2020. 12. 1. 17:22

라이브러리 불러오기

- #include 명령어를 이용해 다양한 라이브러리를 불러올 수 있음

- 집을 지으려면 망치와 같은 도구가 필요하듯이 stdio.h는 여러 기본적인 기능을 담고 있음

 

메인 함수

- C/C++에서는 다양한 함수가 사용될 수 있으나 프로그램은 항상 메인(main) 함수로부터 시작됨

- 함수는 반환 값(Return Value)이 없을 수도 있으나 메인 함수에서는 항상 0을 반환하는 것이 일반적

 

기본적인 출력 함수

- C/C++에서는 사용자에게 특정한 문자들을 출력하기 위해서 printf() 함수를 사용

- printf()는 stdio.h 헤더 파일에 포함되어 있음

 

세미콜론

- C언어에서는 하나의 명령어가 끝났음을 알리기 위해 세미콜론(;)을 붙임

 

시스템 기능 불러오기

- C언어에서는 system() 함수를 이용해 운영체제의 기본적인 기능을 이용할 수 있음

- 명령 프롬프트에서 pause 명령어는 키보드를 입력하기 전까지 대기하는 기능을 수행

 

변수와 상수의 개념

- 변수(Variable)는 변할 수 있는 데이터

- 상수(Constant)는 변하지 않는 데이터

 

 이름표와 이름에 비유하면 쉬움

이름표는 언제든 변할 수 있으니 변수로 생각하고, 이름은 변할 수 없으니 상수로 생각하면 됨

 

변수의 선언

- 변수를 선언할 때는 자료형과 변수명을 입력함, 원하는 경우 초기값을 적용할 수 있음

- 가장 많이 사용되는 변수는 정수형(Integer) 변수임

 

int a;

int a = 7;

 

기본 출력

- stdio.h 헤더 파일에 선언된 printf()를 이용해서 기본적인 정수 데이터를 출력

#include <stdio.h> // 이 헤더만 사용할 경우 system("pause") 오류남
#include <cstdlib>

int main(void) {
	int a = 7;
	printf("The number is %d", a);
	system("pause");
	return 0;
}

 

변수의 초기화와 쓰레기 값

- 초기화되지 않은 변수는 쓰레기 값이 들어감

- Visual Studio는 기본적으로 초기화되지 않은 변수를 감지하고 오류를 출력함

- 정적 변수로 선언된 것은 기본적으로 0으로 값이 초기화됨

- 정적 변수가 아닌 수를 0으로 초기화하려면 값을 일일이 넣어주어야 함

 

정적 변수 - 메인 함수 바깥쪽에 선언된 변수

#include <stdio.h> // 이 헤더만 사용할 경우 system("pause") 오류남
#include <cstdlib>

int a; // 정적 변수

int main(void) {
	printf("The number is %d", a);
	system("pause");
	return 0;
}

 

기본적인 자료형

int - 일반적인 정수형을 표현할 때 사용 (억 단위까지 표현 가능)

long long - 숫자가 긴 정수형을 표현할 때 사용

double - 일반적인 실수형을 표현할 때 사용

string - 문자열을 표현할 때 사용

bool - 참/거짓을 표현할 때 사용

char - 한 문자를 표현할 때 사용

 

예약어와 식별자

- 식별자(Identifier)란 변수나 함수 등의 고유한 이름을 지정할 때 사용함

- 이때 C언어 문법으로 정해진 예약어는 식별자로 사용할 수 없음

string  for  void

bool  if  while

char  return  double

 

정수의 표현 방법

1.

- 컴퓨터가 정수(Integer)를 처리하는 방법을 이해함

- 컴퓨터는 내부적으로 2진수로 숫자를 표현

- 9는 다음과 같이 나타냄

  0     0     0     0    1    0    0    1

부호  64    32   16   8    4    2    1

 

2.

-9는?

부호 절댓값 방식은 다음과 같음

  1     0     0     0    1    0    0    1

부호  64    32   16   8    4    2    1

 

부호가 0이면 양수, 1이면 음수

 

3.

- 부호 절댓값 방식은 다양한 값의 연산을 수행하기 적합하지 않음

- 따라서 2의 보수를 사용

- 2의 보수 = 1의 보수 + 1

(1의 보수 - 모든 비트 뒤집기, 1을 0으로 바꾸고 0을 1로 바꾸고 1을 더해주기)

  1     1     1     1    0    1    1    1

부호  64    32   16   8    4    2    1

 

4.

- 2의 보수를 이용하면 덧셈 연산만을 이용해서 양수와 음수를 연산할 수 있음

- 이때 올림 수가 발생하면 무시

 

   0 0 0 0 1 0 0 1

+ 1 1 1 1 0 1 1 1

   0 0 0 0 0 0 0 0

 

실수의 표현 방법

- 일반적으로 컴퓨터는 오차 없이 정확히 실수를 표현할 수 없음

- 따라서 넓은 범위의 실수를 표현하는 방식을 사용

- 컴퓨터는 실수를 표현할 때 부호, 지수, 유효숫자를 이용함

 

'C언어' 카테고리의 다른 글

조건문  (0) 2020.12.03
연산자  (0) 2020.12.02
기본 입출력  (0) 2020.12.01
Visual Studio 역슬래시  (0) 2020.12.01
C언어 프로그래밍 개발환경 구축  (0) 2020.11.28
Posted by khon98
,