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;
}

참고 항목

참조

포인터