const 및 volatile 포인터

constvolatile 키워드(keyword) 포인터 처리 방법을 변경합니다. const 키워드(keyword) 초기화 후에는 포인터를 수정할 수 없으므로 포인터가 수정되지 않도록 보호됩니다.

volatile 키워드(keyword) 뒤에 있는 이름과 연결된 값이 사용자 애플리케이션의 작업 이외의 작업에 의해 수정될 수 있도록 지정합니다. 따라서 volatile 키워드(keyword) 인터럽트 서비스 루틴과의 통신에 사용되는 여러 프로세스 또는 전역 데이터 영역에서 액세스할 수 있는 공유 메모리의 개체를 선언하는 데 유용합니다.

이름이 선언되면 volatile컴파일러는 프로그램에서 액세스할 때마다 메모리에서 값을 다시 로드합니다. 개체의 최적화 횟수가 상당히 줄어들게 됩니다. 이 키워드는 개체 상태가 예기치 않게 변경되는 경우 예상 가능한 프로그램 성능을 보장하는 유일한 방법이기도 합니다.

포인터 const 로 가리키는 개체를 선언하거나 volatile폼의 선언을 사용합니다.

const char *cpch;
volatile char *vpch;

포인터의 값( 즉 포인터에 저장된 실제 주소)을 폼의 선언으로 constvolatile선언하려면 다음을 사용합니다.

char * const pchc;
char * volatile pchv;

C++ 언어는 개체 또는 포인터 const를 수정할 수 있는 할당을 방지합니다. 그와 같은 할당은 개체 또는 포인터가 선언된 정보를 제거하기 때문에 원래의 선언 의도에 위배됩니다. 다음의 선언을 살펴보세요.

const char cch = 'A';
char ch = 'B';

앞의 두 개체 선언(cchconst char 형식 및 ch문자 형식)을 지정하면 다음 선언/초기화가 유효합니다.

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 은 포인터가 개체가 아니라 상수임을 지정합니다. 선언이 허용되지 않는 것과 동일한 이유로 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

또는 혼합으로 volatileconst 선언된 포인터는 volatile동일한 규칙을 준수합니다.

개체에 대한 const 포인터는 함수 선언에서 다음과 같이 자주 사용됩니다.

errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );

앞의 문은 strcpy_s 함수를 선언합니다. 여기서 세 인수 중 두 인수는 포인터 형식입니다char. 인수는 값이 아닌 참조로 전달되므로 함수는 둘 다 자유롭게 수정할 수 있고 strSource 선언되지 const않은 경우 strSource 둘 다 strDestination 수정할 수 있습니다. as const 선언 strSource 은 호출된 함수에서 변경할 수 없는 호출자를 strSource 보장합니다.

참고 항목

형식 이름에서 typename**으로 표준 변환이 const있으므로 형식 인수 char * 를 strcpy_s 전달하는 것이 합법적입니다. 그러나 그 반대의 경우는 그렇지 않습니다. 개체 또는 포인터에서 특성을 제거하기 const 위한 암시적 변환이 없습니다.

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

참고 항목

포인터 원시 포인터