2011-12-08 3 views
2

내가 예를 들어 있습니다 i의 주소 CONST INT의 포인터로 변환됩니다 때이 경우자격 변환이 어떻게 이루어 집니까?

int i = 1; 
const int *b = &i; 

을, 내가 이해하지 못하는 것은 이다. 자격 변환에서 i이 const 정수로 변환되지 않습니까? 자격 변환이 적용될 때 후드에서 정확히 무엇이 발생합니까?

답변

6

아무런 변화가 없습니다. 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의 아무것도 알고 동안) 아웃 오류가 발생하지 bconst을 가지고 알 수 있습니다. 그러나 추가 된 const로 인해 오류로 간주되지 않는 명령문은 const가 있거나없는 동일한 코드를 생성합니다. 난의

+0

1 도움. 이 답변은 어떤 참고서입니까? – user1086635

+0

@ user1086635 : 이에 대한 참조는 없지만 표준 어딘가에서 찾을 수있을 것입니다. – Dani

1

주소는

없음 INT에서 const 포인터로 변환됩니다. &i은 여전히 ​​int (const int 아님)의 주소입니다. 내부에서 int*은 암시 적으로 const int*으로 변환됩니다. 따라서 *b은 수정할 수 없지만 i은 여전히 ​​수정할 수 있습니다. 당신의 가정이 사실이라면 컴파일러 오류를 줄 것이다 다음,하지만하지 않습니다 :

또한, 다른 방식으로 생각

int i = 1; 
const int *b = &i; 
int *c = &i; // perfectly valid ! 
관련 문제