상수에 대한 포인터를 일반 포인터로 캐스팅해서 접근한 겁니다.
C언어에서 이런 짓을 해야만 하는 경우가 종종 있어요.
예컨대 strchr 함수 같은 것을 보시면, const char *로 문자열 입력을 받습니다.
strchr 함수 자체는 문자열을 수정할 이유가 전혀 없으니까 적절한 선택이었겠지만, 이 함수를 쓰는 입장에서는 non-const 문자열을 넘겨 호출할 경우 non-const 문자를 가리키는 포인터를 받고 싶지 않겠어요?
C++였다면 함수 오버로딩이 가능하니 상수 버전, 비상수 버전을 따로 만들면 그만이지만, C언어에선 그것도 불가능하죠.
결국 C언어의 strchr는 상수 포인터를 받아서 비상수 포인터를 반환하게 되어 있습니다.
위 코드가 안전하게 동작하는 이유는, 애초에 array의 원소들이 non-const로 정의되었기 때문입니다. 그걸 가리키는 포인터에 const가 붙은 게 문제였을 뿐, 애초에 non-const로 정의된 object를 수정하는 건 문제가 없죠.
만약 귀하께서 위 테크닉(포인터 캐스팅으로 const 없애기)을 이용해서 원래 const였던 object를 수정하려고 시도한다면, undefined behavior가 발생하여 그 결과는 예측할 수 없게 됩니다.
...
const이든 아니든 일단 정의된 변수의 주소값은 프로그램에서 바꿀 수 없습니다.
그렇군요..
그러면 위 문제를 해결할만한 아이디어가 있을까요 .?
포인터로 바꾸세요.
포인터로 바꾸세요.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
도와주세요
감이 오지 않아서 그러는데 어떤식으로 바꾸면 될까여?
*a->next = &b 를 하게되면
*a는 읽기전용값이라서 값 변경이 이루어 지지 않습니다.
만약 포인터가 가리키는 객체가 애초에 원래 상수가
만약 포인터가 가리키는 객체가 애초에 원래 상수가 아니었다면, 이런 짓을 해 볼 수 있긴 합니다.
상수에 대한 포인터를 일반 포인터로 캐스팅해서 접근한 겁니다.
C언어에서 이런 짓을 해야만 하는 경우가 종종 있어요.
예컨대
strchr
함수 같은 것을 보시면, const char *로 문자열 입력을 받습니다.strchr 함수 자체는 문자열을 수정할 이유가 전혀 없으니까 적절한 선택이었겠지만, 이 함수를 쓰는 입장에서는 non-const 문자열을 넘겨 호출할 경우 non-const 문자를 가리키는 포인터를 받고 싶지 않겠어요?
C++였다면 함수 오버로딩이 가능하니 상수 버전, 비상수 버전을 따로 만들면 그만이지만, C언어에선 그것도 불가능하죠.
결국 C언어의 strchr는 상수 포인터를 받아서 비상수 포인터를 반환하게 되어 있습니다.
위 코드가 안전하게 동작하는 이유는, 애초에 array의 원소들이 non-const로 정의되었기 때문입니다. 그걸 가리키는 포인터에 const가 붙은 게 문제였을 뿐, 애초에 non-const로 정의된 object를 수정하는 건 문제가 없죠.
만약 귀하께서 위 테크닉(포인터 캐스팅으로 const 없애기)을 이용해서 원래 const였던 object를 수정하려고 시도한다면, undefined behavior가 발생하여 그 결과는 예측할 수 없게 됩니다.
댓글 달기