programing

constchar* 변수의 값을 변경할 수 있는 이유는 무엇입니까?

javajsp 2023. 10. 16. 21:31

constchar* 변수의 값을 변경할 수 있는 이유는 무엇입니까?

C의 다음 코드가 작동하는 이유는 무엇입니까?

const char* str = NULL;
str = "test";
str = "test2";

str은 일정한 문자를 가리키는 포인터인데 왜 다른 문자열 리터럴을 할당할 수 있습니까?또한 str이 수정되는 것을 어떻게 보호할 수 있습니까?예를 들어 나중에 str을 더 긴 문자열에 할당하여 메모리의 다른 부분에 쓰기만 하면 문제가 발생할 수 있습니다.

시험에서 과제물 전후로 str의 기억 주소를 출력했는데도 바뀐 적이 없다는 것을 덧붙여야겠습니다.그래서 str이 성소를 가리키는 포인터임에도 불구하고 메모리는 실제로 수정되고 있습니다.혹시 이것이 C와의 레거시 문제가 아닌지 궁금합니다.

포인터가 일정하지 않은 포인터를 변경하는 것입니다(포인팅하는 것은 일정하지 않습니다.

포인터 자체를 일정하게 하려면 선언은 다음과 같습니다.

char * const str = "something";

아니면

char const * const str = "something";  // a const pointer to const char
const char * const str = "something";  //    same thing

비정규 데이터에 대한 상수 포인터는 일반적으로 상수에 대한 포인터보다 덜 유용한 구문입니다.

또한 str이 수정되는 것을 어떻게 보호할 수 있습니까?

char * const str1; // str1 cannot be modified, but the character pointed to can
const char * str2; // str2 can be modified, but the character pointed to cannot
const char * const str3 // neither str3 nor the character pointed to can be modified.

이를 읽는 가장 쉬운 방법은 변수 이름에서 시작하여 왼쪽으로 읽는 것입니다.

  • str1은 문자에 대한 상수 포인터입니다.
  • str2는 문자 상수가리키는 포인터입니다.
  • str3은 문자 상수에 대한 상수 포인터입니다.

참고: 일반적인 경우에는 오른쪽에서 왼쪽으로 읽는 것이 작동하지 않지만, 간단한 선언의 경우에는 간단한 방법입니다."The C Programming Language"의 코드를 기반으로 하는 자바 애플릿을 발견했는데, 이 애플릿은 어떻게 하는지에 대한 설명이 충분히 들어있는 선언문을 해독할 수 있습니다.

관련 노트에서 "const 포인터 pointer to const"를 반드시 살펴봅니다.그것은 일부 사람들이 항상 정확하다고 부르는 것에 도움이 됩니다.가끔 참고할 수 있도록 북마크에 보관하고 있습니다.

당신이 찾고 있는 건 아마 구문일 겁니다

const char* const str = NULL;
str = "test";
str = "test2";

컴파일/빌드를 시도할 때 컴파일러 오류가 발생하는 char* 뒤의 "const"에 주목하십시오.

또한 변수를 const로 선언하면 변수가 읽기 전용이며 값이 일정하다는 것을 의미하지 않습니다!

언급URL : https://stackoverflow.com/questions/440331/why-can-i-change-the-value-of-a-const-char-variable