> 백엔드 개발 > C++ > C에서 포인터-포인터를 Non-Const로, 포인터-포인터를 Const로 변환할 수 없는 이유는 무엇입니까?

C에서 포인터-포인터를 Non-Const로, 포인터-포인터를 Const로 변환할 수 없는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-01 02:42:09
원래의
491명이 탐색했습니다.

Why Can't I Convert a Pointer-to-Pointer to Non-Const to a Pointer-to-Pointer to Const in C  ?

포인터 변환: 포인터 간 변환에 제한이 있는 이유는 무엇입니까?

C에서는 일반적으로 포인터를 비 포인터로 캐스팅하는 것이 허용됩니다. -const 유형을 const 유형에 대한 포인터로 지정합니다. 이는 상수 데이터만 수정할 수 있도록 허용하는 "상수 정확성" 원칙을 따릅니다.

그러나 포인터에 대한 포인터를 처리할 때 특이한 예외가 발생합니다. 앞서 언급한 변환과 달리 "비상수에 대한 포인터에 대한 포인터"를 "const에 대한 포인터에 대한 포인터"로 변환하는 것은 금지되어 있습니다.

다음 코드 조각을 고려하세요.

char *s1 = 0;
const char *s2 = s1; // OK...
char *a[MAX]; // aka char **
const char **ps = a; // error!
로그인 후 복사

왜 a를 ps에 할당하는 것이 불법인가요? 대답은 표준에 있습니다.

const char c = 'c';
char* pc;
const char** pcc = &pc;   // not allowed
*pcc = &c;
*pc = 'C';                // would allow to modify a const object
로그인 후 복사

이 예에서

  1. c는 상수 문자입니다.
  2. pc는 a에 대한 상수가 아닌 포인터입니다.
  3. &pc를 사용하여 pcc(const에 대한 포인터에 대한 포인터)를 초기화하려는 시도는 다음과 같습니다. 허용되지 않습니다.

이 변환이 허용되면 상수 개체를 수정할 수 있습니다. 예를 들어 *pcc는 const 문자를 가리키지만 *pc는 수정 가능합니다. 이는 잠재적으로 상수 데이터에 대한 변경을 허용하므로 const 정확성의 전제를 위반합니다.

따라서 포인터를 non-const에 대한 포인터로, const에 대한 포인터에 대한 포인터로 변환하는 것에 대한 제한은 상수 개체의 무결성을 유지하고 의도하지 않은 데이터 수정을 방지합니다.

위 내용은 C에서 포인터-포인터를 Non-Const로, 포인터-포인터를 Const로 변환할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿