C언어 공부 24
변수 선언에서 const 키워드는 그 변수를 대입 연산, 증가 연산, 감소 연산으로 값을 변경할 수 없는 변수로 만든다.
단순한 변수나 배열을 선언할 때 const 키워드를 사용하는 것은 아주 쉽다. 포인터의 경우에는 좀더 복잡하다. 왜냐하면 포인터 자체를 const로 만드는 것과, 포인터가 가리키는 값을 const로 만드는 것을 구별해야 하기 때문이다.
const를 *의 왼쪽 어딘가에 넣으면 그 데이터를 상수로 만든다.
const를 *의 오른쪽에 넣으면 그 포인터 자체를 상수로 만든다.
헤더파일 방식의 장점은, 하나의 파일에 정의 선언들을 사용하고, 다른 파일들에 참조 선언들을 사용해야 한다는 것을 기억할 필요가 없다는 것이다. 단지 모든 파일들이 동일한 헤더파일을 포함하면 된다. 헤더파일 방식의 단점은, 데이터가 중복된다는 것이다.
volatile 한정자는, 어떤 변수가 프로그램이 아닌 대행자에 의해 그 값이 변경될 수 있다고 컴파일러에게 알린다. 일반적으로 그것은 하드웨어 주소에 또는 동시에 실행되는 여러 프로그램들이 공유하는 데이터에 사용된다.
restrict 키워드는 컴파일러가 특정 유형의 코드를 최적화 할 수 있도록 허용함으로써 계산 능력을 향상 시킨다. restrict 키워드는 포인터에만 적용할 수 있다. 그것은 그 포인터가 어떤 데이터 객체에 접근하는 유일한 최초 수단이라는 것을 나타낸다.
double stick(double ar[static 20]);
static을 이와같이 사용하는 것을, 함수 호출에 사용하는 실 전달인자가 최소한 20개의 원소를 가지는 배열의 첫번째 원소를 가리키는 포인터여야 한다는 것을 나타낸다. 이렇게 하는 목적은, 컴파일러가 그 정보를 사용하여 함수의 코드를 최적화 할 수 있도록 하기 위해서 이다.
정적 메모리의 양은 컴파일 할 때 결정되고, 정적 데이터는 프로그램이 메모리에 적재될때 함께 적재된다.
자동변수는 프로그램의 실행 도중에 할당되고 해제된다. 그래서 자동변수가 사용하는 메모리의 양은 프로그램이 실행하는 동안 수시로 변한다.
C의 저장 클래스
1.자동(Auto matic) - 저장 클래스 지정자 없이 또는 auto 저장 클래스 지정자를 사용하여 블록안에(또는 함수 머리에 있는 매개 변수로) 선언된 변수는 자동 저장 클래스에 속한다. 자동 변수는 자동 수명, 블록 범위, 무연계를 가진다. 초기화 하지 않으면, 자동 변수의 값은 결정되지 않는다.
2.레지스터(register) - register 저장 클래스 지정자를 사용하여 블록안에(또는 함수 머리에 있는 매개변수로) 선언된 변수는 레지스터 저장 클래스에 속한다. 레지스터 변수는 자동수명, 블록범위, 무연계를 가진다. 레지스터 변수의 주소는 얻을 수 없다.
정적 무연계(static, no linkage) - static 저장 클래스 지정자를 사용하여 블록안에 선언된 변수는 무연계 정적 저장 클래스에 속한다. 이 블록범위 정적 변수는 정적 수명, 블록 범위, 무연계를 가진다. 컴파일 될 때 단 한번 초기화 된다. 명시적으로 초기화 하지 않으면, 모든 바이트들이 0으로 설정된다.
정적 외부 연계(static, external linkage) - static 저장 클래스 지정자 없이 모든 함수들의 외부에 선언된 변수는 외부연계 정적 저장 클래스에 속한다. 외부연계 정적 변수는 정적 수명, 파일 범위, 외부 연계를 가진다. 컴파일 될 때 단 한번 초기화 된다. 명시적으로 초기화 하지 않으면, 모든 바이트들이 0으로 설정된다.
정적 내부 연계(static, internal linkage) - static 저장 클래스 지정자를 사용하여 모든 함수들의 외부에 선언된 변수는 내부연계 정적 저장 클래스에 속한다. 내부연계 정적 변수는 정적 수명, 파일 범위, 내부연계를 가진다. 컴파일 될 때 단 한번 초기화 된다. 명시적으로 초기화 하지 않으면, 모든 바이트들이 0으로 설정된다.
할당된 메모리는 malloc() (또는 관련 함수)에 의해 제공된다. 이 함수는 요청한 만큼의 바이트 수를 가지는 메모리 블록을 가리키는 포인터를 리턴한다. 이 메모리 블록은 free()함수를 호출하여 해제함으로써 재사용 할 수 있다. free() 함수는 그 메모리 블록의 주소를 전달인자로 사용한다.
const 데이터 형 한정자는 데이터 상수로 한정한다. 포인터에 const 한정자를 사용하면, 선언의 어느 위치에 const를 놓느냐에 따라 포인터 자체가 상수라고 나타내거나, 포인터가 가리키는 데이터가 상수라고 나타낼 수 있다.
volatile 데이터형 한정자는 프로그램이 아닌 다른 대행자에 의해 데이터가 변경될 수 있다는 것을 나타낸다. 이것을 사용하는 목적은, 사용하지 않을 경우에 컴파일러가 가정할 최적화를 피하라고 경고하는 것이다.
restrict 데이터형 한정자도 최적화를 위해서 제공된다. 포인터를 restrict로 한정하면, 그 포인터를 통해서만 데이터 블록에 접근할 수 있다.