>백엔드 개발 >C++ >C에서 포인터-포인터-비상수를 포인터-포인터-상수로 변환하는 것이 금지된 이유는 무엇입니까?

C에서 포인터-포인터-비상수를 포인터-포인터-상수로 변환하는 것이 금지된 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-20 15:08:14546검색

Why is Converting a Pointer-to-Pointer-to-Non-const to a Pointer-to-Pointer-to-const Prohibited in C  ?

포인터 역참조: 'const에 대한 포인터에 대한 포인터'로의 변환이 금지되는 이유

C에서는 포인터를 변환하는 것이 허용됩니다. -to-non-const에서 포인터-to-const로. 그러나 포인터-포인터-비-const에서 포인터-포인터-to-const로의 변환은 허용되지 않습니다. 이는 왜?

이러한 제한의 이유를 이해하려면 포인터 역참조를 고려해야 합니다. 포인터 간 역참조는 가장 안쪽 포인터가 가리키는 값에 액세스하는 것을 나타냅니다. 예를 들어 다음 코드를 고려해 보세요.

int i = 10;
int *ptr = &i;
int **pptr = &ptr;

여기에서 **pptr은 *ptr과 동일하며 이는 단순히 i 값입니다.

그러나 다음으로 변환을 허용한다면 포인터-포인터-const, 유사한 역참조 작업은 상수 값을 생성합니다. 이로 인해 불일치가 발생하여 const 포인터의 불변성이 손상됩니다. 예:

char *s1 = 0;
const char *s2 = s1; // OK...
char *a[MAX]; // aka char **
const char **ps = a;  // Error!

여기서 s2는 const 포인터입니다. 즉, 다른 것을 가리킬 수 없습니다. 그러나 ps가 허용되면 잠재적으로 a를 얻기 위해 역참조한 다음 a의 값을 수정하여 s2가 가리키는 값을 효과적으로 변경할 수 있습니다. 이는 금지됩니다.

따라서 const의 무결성을 유지하려면 포인터에서 포인터-포인터-비-const에서 포인터-포인터-to-const로의 변환을 금지합니다. 이렇게 하면 const 포인터의 불변성이 유지되어 상수 값이 의도치 않게 수정되는 것을 방지할 수 있습니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.