const 및 volatile 포인터
const 및 volatile 키워드(keyword) 포인터 처리 방법을 변경합니다. const
키워드(keyword) 초기화 후에는 포인터를 수정할 수 없으므로 포인터가 수정되지 않도록 보호됩니다.
volatile
키워드(keyword) 뒤에 있는 이름과 연결된 값이 사용자 애플리케이션의 작업 이외의 작업에 의해 수정될 수 있도록 지정합니다. 따라서 volatile
키워드(keyword) 인터럽트 서비스 루틴과의 통신에 사용되는 여러 프로세스 또는 전역 데이터 영역에서 액세스할 수 있는 공유 메모리의 개체를 선언하는 데 유용합니다.
이름이 선언되면 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
문자 형식)을 지정하면 다음 선언/초기화가 유효합니다.
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
또는 혼합으로 volatile
const
선언된 포인터는 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;
}
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기