const 및 volatile 포인터
Const 및 휘발성 키워드를 포인터를 처리 하는 방법을 변경 합니다.해당 const 키워드를 초기화 후; 포인터를 수정할 수 없도록 지정 포인터가 수정은 이후부터 보호 됩니다.
volatile 키워드를 따르는 이름과 연결 된 값 작업 사용자 응용 프로그램에 의해 수정 될 수 있음을 지정 합니다.따라서, 해당 volatile 키워드를 여러 프로세스 또는 전역 데이터 영역 통신 인터럽트 서비스 루틴을 사용 하 여 액세스할 수 있는 공유 메모리 개체를 선언 하는 데 유용 합니다.
때 이름을 선언으로 volatile, 컴파일러가 메모리에서 값이 프로그램에 액세스할 때마다 다시 로드 됩니다.가능한 최적화가 현저 하 게 줄일 수 있습니다.그러나 개체의 상태를 변경할 수 있습니다 예기치 않게 때 예측 가능한 프로그램 성능을 보장 하는 유일한 방법은입니다.
포인터와 포인터가 가리키는 개체를 선언 하려면 const 또는 volatile, 형식 선언을 사용 하 여:
const char *cpch;
volatile char *vpch;
포인터 값을 선언 합니다 — 포인터에 저장 된 실제 주소,-로 const 또는 volatile, 형식 선언을 사용 하 여:
char * const pchc;
char * volatile pchv;
C + + 언어 개체의 수정을 허용 하는 할당 수 없습니다 또는 포인터 선언으로 const.이러한 대입, 개체 또는 포인터 선언 된 정보가 제거 될 수 있으므로 원래 선언의 의도 위반 합니다.다음 선언을 참조하십시오.
const char cch = 'A';
char ch = 'B';
앞의 선언이 두 개체의 (cch, 형식 const char, 및 ch, 형식 char), 다음과 같은 선언을/초기화가 잘못 되었습니다:
const char *pch1 = &cch;
const char *const pch4 = &cch;
const char *pch5 = &ch;
char *pch6 = &ch;
char *const pch7 = &ch;
const char *const pch8 = &ch;
다음 선언/초기화 오류입니다.
char *pch2 = &cch; // Error
char *const pch3 = &cch; // Error
수는 pch2 를 통해 상수 개체를 수정할 수 있고 따라서 허용 되지 않습니다에 대 한 포인터를 선언 합니다.수는 pch3 지정 하는 pointer 는 상수, 개체입니다. 같은 이유로 선언의 허용 되지 않는 있는 pch2 선언이 허용 되지 않습니다.
다음 8 개의 할당 포인터를 할당 하 고 위 선언에 대 한 포인터 값을 변경 표시 합니다. 지금은 초기화에 대 한 잘못 된 가정 pch1 - pch8.
*pch1 = 'A'; // Error: object declared const
pch1 = &ch; // OK: pointer not declared const
*pch2 = 'A'; // OK: normal pointer
pch2 = &ch; // OK: normal pointer
*pch3 = 'A'; // OK: object not declared const
pch3 = &ch; // Error: pointer declared const
*pch4 = 'A'; // Error: object declared const
pch4 = &ch; // Error: pointer declared const
포인터를 선언 하는 volatile, 또는 함께 const 및 volatile, 동일한 규칙을 따릅니다.
포인터를 const 개체 함수 선언에는 다음과 같이 사용 됩니다 많습니다.
errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );
앞의 문은 함수를 선언 strcpy_s, 두 세 개의 인수 형식에 대 한 포인터는 어디 char.인수는 참조로 전달 및 값으로 함수 모두 수정 될 수 없습니다 때문에 strDestination 및 strSource 경우 strSource 로 선언 되지 않은 const.수는 strSource 와 const 호출자는 보장 strSource 가 호출된 되는 함수를 변경할 수 없습니다.
[!참고]
표준 변환 하기 때문에 typename* 에 consttypename*, 올바른 형식의 인수를 전달 하는 char * 에 strcpy_s. 그러나, 반대의 true 아닙니다. 제거 하려면 암시적 변환이 존재는 const 특성에서 개체 또는 포인터입니다.
A const 는 주어진 형식의 포인터에 대 한 포인터 같은 종류의 할당 될 수 있습니다.그러나에 대 한 포인터는 아닙니다 const 배정할 수는 const 포인터입니다.다음 코드는 올바른 및 잘못 된 할당을 보여 줍니다.
// const_pointer.cpp
int *const cpObject = 0;
int *pObject;
int main() {
pObject = cpObject;
cpObject = pObject; // C3892
}
다음 예제는 개체에 대 한 포인터에 대 한 포인터의 경우 const로 선언 하는 방법을 보여 줍니다.
// const_pointer2.cpp
struct X {
X(int i) : m_i(i) { }
int m_i;
};
int main() {
// correct
const X cx(10);
const X * pcx = &cx;
const X ** ppcx = &pcx;
// also correct
X const cx2(20);
X const * pcx2 = &cx2;
X const ** ppcx2 = &pcx2;
}