2011-12-21 3 views
0

가능한 중복 :
const int = int const?C/C++ 상수

키워드의이 조합의 차이점은 무엇입니까?

const int* 

int const* 

int* const 

포인터를 사용하여 주소에 액세스하여 상수 값을 수정할 수 있습니까?

+3

Arrgh, 너무 많은 중복을 오른쪽 또는 왼쪽으로 읽어! 브루스 에켈 (Bruce Eckel)에 의해 ++ C에서 생각 –

+0

은 CONST을 사용하고 바로 왼쪽에있는 경우가 아니면 * –

+0

CONST가에 다음 왼쪽에 바인딩 할 때 이와 유사한 구문의 차이점에 대한 섹션을 포함하여 C의 대부분의 모든 모서리를 ++ 설명 훌륭한 책이다 오른쪽 바인딩합니다. –

답변

2

:

const T   ===    T const 

const T *   ===    T const * 

하지만

T * const 

포인터 일정을 만들지 만, 반드시 내용 of T.

const T * const  ===   T const * const 

은 T의 내용과 포인터 자체를 모두 상수로 만듭니다.

const의 내용 변경에 관해서는

: 당신이 할 수 없게해야한다,하지만 당신은 구어체로 "정의되지 않은 동작이라고 것을 얻을 수 있도록 컴파일러/OS/CPU, 당신을 중지 너무 열심히하지 마세요 "어떤 말의 좋은 방법이다"도움이 될 수있는 몇 가지 시스템 "

1

첫 번째 두 개는 const int에 대한 변수 포인터입니다. 포인터 자체는 변경할 수 있습니다. const를 캐스팅하지 않으면이 포인터를 통해 int를 변경할 수 없습니다. (그러나 const가 아닌 참조를 통해 수정할 수 있습니다.)

마지막은 변수 int에 대한 const 포인터입니다. const를 캐스팅하지 않으면 포인터 자체를 변경할 수 없습니다. int는 포인터를 통해 변경할 수 있습니다.

3
const int* 

int const* 

두 가지 모두 상수 유형 int에 대한 포인터를 선언합니다. 즉, 포인터가 다른 주소를 가리 키도록 지정할 수 있지만 상수 정수 데이터 유형을 수정하려는 시도는 입니다. 정의되지 않은 동작.

int* const 

int 유형에 대한 상수 포인터를 선언합니다. 즉, 포인터는 항상 동일한 주소를 가리키는 새 주소를 할당 할 수 없지만 포인터가 가리키는 정수는 변경할 수 있습니다.

포인터를 사용하여 주소에 액세스하여 상수 값을 수정할 수 있습니까?

예, 그것은 가능하지만 그것은 정의되지 않은 동작을 나타내는 병이 형성 프로그램으로 이어집니다.

+1

수정 사항 - int가 반드시 상수 일 필요는 없습니다. 포인터를 통해 int를 수정하려고하면 * 컴파일시 오류가 발생합니다. * –

1

const int*int const*은 모두 상수 int에 대한 포인터입니다. 즉, 가리키는 값은 변경할 수 없지만 포인터 자체는 변경할 수 있습니다.

세 번째 예제 int *const은 int에 대한 상수 포인터입니다. 즉, 값을 변경할 수는 있지만 포인터는 변경할 수 없습니다.

예 포인터를 사용하여 주소 값을 변경할 수는 있지만 정의되지 않은 동작이므로 피해야합니다. C++도 변수의 const을 제거하기 위해 const_cast을 제공합니다.

const 키워드와 관련된 다른 문의 사항은 const correctness section of the C++ FAQ을 참조하십시오.일반적으로

0

This 무작위 충돌. This은 여러 가지 시나리오에서 어느 부분이 const이되는지 확인할 수 있도록 분리 해 놓는 것에 대해 이야기하는 또 다른 사례입니다.

0

왼쪽에 Const가 바인딩됩니다.
가장 왼쪽 절이 아니라면 오른쪽에 바인딩됩니다.

은 그냥

const int* => (const int)* => "pointer" to "const int" 
          => Pointer can change. 
          => Can't change the value it points at (the int is const) 

int const* => (int const)* => "pointer" to "const int" 
          => As above 

int* const => int (* const) => "const pointer" to "int" 
          => Can't change the pointer (its const) it always points 
          => at the same things. 
          => You can change the value of the object it points at.