2013-08-12 7 views
2

나는 C99 사양 (p.11506)를 말한다 (N1256.pdf)를 찾고 있었어요 : 어떤 개체의C99 : "int const * ptr"은 무엇을 의미합니까?

const int *ptr_to_constant; 
int *const constant_ptr; 

"내용은 ptr_to_constant 그 포인터를 통해 수정 될 수 없다 가리키는하지만, 자신을 ptr_to_constant 비슷하게, constant_ptr에 의해 지시 된 int의 내용은 변경 될 수 있지만, constant_ptr 그 자체는 항상 같은 위치를 가리켜 야한다. " (6.7.5.1 포인터 선언자)

앞에서 읽은 다음 두 문장은 동일한 동작을 발생시킵니다.

int *const constant_ptr; /* This form is mentioned in the standard */ 
int const *constant_ptr; /* This form is NOT mentioned in the standard */ 

두 번째 양식이 올바른지 또는 확장인지 궁금합니다. 사전에

감사합니다, -S

답변

5

실제로 int const *constant_ptr;const int *ptr_to_constant;과 동일합니다. const 키워드는 왼쪽 요소에 영향을 미치며, 그렇지 않은 경우 오른쪽 요소에 영향을줍니다.

int const *constant_ptr; 여기에서 const 왼쪽의 요소는 int입니다.

const int *ptr_to_constant; 여기에서 const은 왼쪽에 요소가 없으므로 오른쪽에 적용됩니다. 즉, int입니다. 여기


const int *ptr_to_constant; 

는, 포인터가 가리키는 값만 일정하다.

int *const constant_ptr; 

여기 포인터는 일정합니다.

int const *constant_ptr; 

여기서 포인터에 의해 지시되는 값만이 일정합니다.

int const * const constant_ptr_to_constant; 

여기에서 포인터와이 포인터가 가리키는 값은 상수입니다.

편집 :

int const *constant_ptr;, 당신은 포인터 constant_ptr 전화,하지만 난 당신의 이름 체계를 유지하는 경우, 그것은 ptr_to_constant를 호출해야합니다.

+0

감사 인사. 이 행동에 대한 언급을 제안 해 주시겠습니까? – user926918

+0

@ user926918 [이 질문] (http://stackoverflow.com/questions/5503352/const-before-or-const-after)가 귀하를 심문 할 수 있습니다. – nouney

+0

구문 분석의 가능한 이유에 대한 흥미로운 토론이 있었지만 문제는 해결되지 않았습니다. 나는 C99 표준에서 다시 예선 규칙을 재확인했으나, 내가 알고있는 한,이 문제에 관해 침묵했다. 즉, 마지막 문장이 잘못되었거나 지정되지 않았거나 정의되지 않았 음을 말하지는 않습니다. 그래서 그것은 관행이 표준의 연장 인 것처럼 보이는 것이 나에게 의심 스럽습니다. – user926918

1

키워드 "const"이 두 경우에 다른 것을 수정합니다.

"const int *"는 변경할 수없는 "int"부분임을 의미합니다.

"int * const"는 변수 값 자체 (포인터) 만 변경할 수 없음을 의미합니다.

이것은 인용 된 텍스트에 설명되어 있지만보다 정교한 방식으로 나와 있습니다.

몇 가지 과제를 수행하고 어떤 오류가 발생했는지 살펴보고 아이디어를 얻으십시오.

+1

혼란이있는 것 같습니다. 표준에 주어진 두 번째 형식에 대해 묻는 중이 었습니다. 나는이 질문에 명시 적으로 언급 할 것이다. – user926918

+0

@ user926918 언급 한 모든 것이 표준에 있습니다. 오해입니다. –

+0

네 말이 맞아. 내 잘못이야. 확실하지 않은 경우 "int const * constant_ptr;" 전적으로 표준 (또는 어떤 버전의 표준인지 또는 준수하지 않는지)이지만, 여러 곳에서 사용되는 것을 보아 왔으며, 실제로는 실제로 사용되며 모든 최신 C/C++ 컴파일러에서 컴파일해야합니다. –

2

'const'키워드가 별표의 왼쪽에 있고 선언에서 유일한 키워드 인 인 경우 포인터로 가리키는 객체는 일정하지만 포인터 자체는 가변적입니다. 은`CONST '키워드는 별표의 오른쪽에, 그리고 선언에서 그러한 키워드 경우

int a = 1; 
int b = 2; 
const int *p1; 
p1 = &a; 
p1 = &b; // Can be pointed to another variable 
*p1 = 23; // <----- NOT ALLOWED 

, 다음 포인터가 가리키는 객체는 변수이지만, 포인터 는 일정; 즉, 일단 포인터가 초기화되면 포인터를 통해 항상 동일한 객체 을 가리킬 것입니다. 은`CONST '키워드는 별표의 양쪽에있는 경우

int a = 1; 
int b = 2; 
int * const p2 = &a; 
*p2 = 7; // <----- Can assign a value via indirection 
p2 = &b; // <----- NOT ALLOWED 

는 포인터 과 뾰족한 물체 양쪽은 일정하다.

int a = 1; 
int b = 2; 
const int * const p3 = &b; 
*p3 = 42; // <------ NOT ALLOWED 
p3 = &a; // <------ NOT ALLOWED 
관련 문제