2017-02-19 18 views
0

이것은 코드입니다.정수를 가리키는 포인터를 수정할 때 컴파일러에서 오류를 표시하지 않는 이유는 무엇입니까?

int main() 
    {int v=2; 
    const int *p=&v; 
    ++v; //Option 1: Does work, but why should it? 
    // ++*p; //Option 2: Does not work 
    }    

예상대로 컴파일러에서 옵션 2에 대해 오류가 발생합니다. 그러나 포인터의 내용을 정수로 수정하는 경우 옵션 1을 사용합니다. 왜? 아니면 const의 의미에 대해 잘못된 점을 이해하고 있습니까? 스택과 반대로 힙의 변수에만 적용 할 수 있습니까?

+3

는'v'는 const가 아니라 왜 컴파일러가 수정을 허용해서는 안되나요? 'const'는 "이 객체는 결코 수정 될 수 없다"는 뜻이 아닙니다. "이 객체는이 포인터 나 참조를 통해 수정할 수 없습니다"라는 의미입니다. –

+0

@IgorTandetnik const 개체는 수정 될 수 없습니다. 여러분은 포인터에 최상위가 아닌 const 한정자에 대해 이야기하고 있습니다. 중요한 점은 'const'는 다른 상황에서 다른 것을 의미합니다. –

+0

@ M.M 저는 실제로 다소 단순화되어있었습니다. const 객체를 생각하는 한 가지 방법은 (constally) 비 const 포인터 나 참조를 결코 얻을 수 없으므로 수정할 수 없다는 것입니다. –

답변

1

또는 const의 의미에 대해 잘못된 점을 알고 있습니까?

예.

당신이있을 때 : 당신은 p을 통해 개체를 수정할 수 없습니다하지만 당신은 여전히 ​​v를 통해 직접 객체를 수정할 수 있습니다

int v = 2; 
const int *p=&v; 

. 다른 포인터를 통해 개체를 수정할 수도 있습니다.

int* p2 = &v 
*p2 = 10; // OK. 
0

const은 '상수'를 의미하지 않습니다. 기본적으로 '읽기 전용'을 의미합니다. const 개체에 대한 포인터를 정의 할 때 개체가 결코 변경 될 수 없다는 것을 의미하지는 않습니다. 단지 포인터을 통해 해당 개체 에 쓸 수 없다는 것을 의미합니다.

실제로 개체가 const (변경할 수 없으므로)이고 volatile (다른 것으로 변경 될 수 있음을 나타냄)을 지정하는 것이 가능하고 때로는 의미가 있습니다. 예를 들어, MS-DOS 시대에 BIOS는 40:6c (세그먼트 0x40의 오프셋 0x6c)의 타이머를 유지했는데 55ms마다 업데이트되었지만 직접 쓸 수는 없었습니다. 그것에 대한 포인터 좋아 정의

long const volatile *bios_timer = MK_FP(0x40, 0x6c); 

그래서, (적어도이 포인터를 통해)이 위치에 쓰기를 시도 이었다 허용되지,하지만 당신은 그것을 읽을 줄 값이 일반에 변경 것이며, 지속적으로.

는 [가 위의 소리를 수있는 방법을 그 반대를 참고 :이 (아마도) 여전히 존재 - 의심 할 여지없이 실패합니다 사용자 모드에서 직접 액세스를 시도하지만, 보호 모드 OS와.]