내가 예를 들어 있습니다 i
의 주소 CONST INT의 포인터로 변환됩니다 때이 경우자격 변환이 어떻게 이루어 집니까?
int i = 1;
const int *b = &i;
을, 내가 이해하지 못하는 것은 이다. 자격 변환에서 i
이 const 정수로 변환되지 않습니까? 자격 변환이 적용될 때 후드에서 정확히 무엇이 발생합니까?
내가 예를 들어 있습니다 i
의 주소 CONST INT의 포인터로 변환됩니다 때이 경우자격 변환이 어떻게 이루어 집니까?
int i = 1;
const int *b = &i;
을, 내가 이해하지 못하는 것은 이다. 자격 변환에서 i
이 const 정수로 변환되지 않습니까? 자격 변환이 적용될 때 후드에서 정확히 무엇이 발생합니까?
아무런 변화가 없습니다. const
은 엄격하게 컴파일 타임 엔티티입니다. 컴파일러는 const
의 지식 만 사용하여 명령문이 오류인지 여부와 코드 생성 여부를 결정합니다. 따라서, 다음은 :
int i = 1;
const int *b = &i;
생성 된 코드의 기간에
int i = 1;
int *b = &i;
동일하다. 다음 작업을 수행하지만 경우 :
int i = 1;
const int *b = &i;
*b = 1;
컴파일러는 (은 i
의 아무것도 알고 동안) 아웃 오류가 발생하지 b
이 const
을 가지고 알 수 있습니다. 그러나 추가 된 const로 인해 오류로 간주되지 않는 명령문은 const가 있거나없는 동일한 코드를 생성합니다. 난의
주소는
없음 INT에서 const 포인터로 변환됩니다. &i
은 여전히 int
(const int
아님)의 주소입니다. 내부에서 int*
은 암시 적으로 const int*
으로 변환됩니다. 따라서 *b
은 수정할 수 없지만 i
은 여전히 수정할 수 있습니다. 당신의 가정이 사실이라면 컴파일러 오류를 줄 것이다 다음,하지만하지 않습니다 :
또한, 다른 방식으로 생각
int i = 1;
const int *b = &i;
int *c = &i; // perfectly valid !
1 도움. 이 답변은 어떤 참고서입니까? – user1086635
@ user1086635 : 이에 대한 참조는 없지만 표준 어딘가에서 찾을 수있을 것입니다. – Dani