const int *, const int * const 및 int const *의 차이점은 무엇입니까? int*, const int

사용하는 방법까지 난 항상 혼란 const int*, const int * const그리고 int const *정확하게. 할 수있는 것과 할 수없는 것을 정의하는 일련의 규칙이 있습니까?

과제, 기능 전달 등의 측면에서 모든 할 일과하지 말아야 할 것을 알고 싶습니다.



답변

시계 방향 / 나선형 규칙에 따라 뒤로 읽습니다 .

  • int* -int에 대한 포인터
  • int const * -const int에 대한 포인터
  • int * const -int에 대한 const 포인터
  • int const * const -const int에 대한 const 포인터

이제 첫 번째 const는 유형의 양쪽에있을 수 있습니다.

  • const int * == int const *
  • const int * const == int const * const

정말로 미쳐 가고 싶다면 다음과 같이 할 수 있습니다.

  • int ** -int를 가리키는 포인터
  • int ** const -int에 대한 포인터에 대한 const 포인터
  • int * const * -int에 대한 const 포인터에 대한 포인터
  • int const ** -const int에 대한 포인터에 대한 포인터
  • int * const * const -int에 대한 const 포인터에 대한 const 포인터

그리고 우리는 다음의 의미를 명확하게합니다 const.

int a = 5, b = 10, c = 15;

const int* foo;     // pointer to constant int.
foo = &a;           // assignment to where foo points to.

/* dummy statement*/
*foo = 6;           // the value of a can´t get changed through the pointer.

foo = &b;           // the pointer foo can be changed.



int *const bar = &c;  // constant pointer to int 
                      // note, you actually need to set the pointer 
                      // here because you can't change it later ;)

*bar = 16;            // the value of c can be changed through the pointer.    

/* dummy statement*/
bar = &a;             // not possible because bar is a constant pointer.           

foo상수 정수에 대한 변수 포인터입니다. 이것은 당신이 가리키는 것을 변경하지만 당신이 가리키는 값은 변경할 수 없습니다. 가장 자주 이것은 C 스타일 문자열에서 볼 수 있습니다 const char. 가리키는 문자열을 변경할 수 있지만 이러한 문자열의 내용을 변경할 수는 없습니다. 문자열 자체가 프로그램의 데이터 세그먼트에 있고 변경해서는 안되는 경우에 중요합니다.

bar변경할 수있는 값에 대한 상수 또는 고정 포인터입니다. 이것은 여분의 구문 설탕이없는 참조와 같습니다. 이 사실 때문에 일반적으로 T* const포인터를 허용하지 않는 한 포인터 를 사용하는 참조를 사용합니다 NULL.


답변

시계 방향 / 나선 규칙에 대해 모르는 경우 : 변수 이름에서 시작하여 시계 방향으로 (이 경우에는 뒤로) 다음 포인터 또는 유형으로 이동하십시오 . 식이 끝날 때까지 반복하십시오.

데모는 다음과 같습니다.

int에 대한 포인터

int const에 대한 const 포인터

int const에 대한 포인터

const int에 대한 포인터

int에 대한 const 포인터


답변

나는 모든 것이 여기에 이미 대답했다고 생각하지만, 나는 당신이 typedefs를 조심해야한다고 덧붙이고 싶다 ! 그들은 단지 텍스트를 대체하는 것이 아닙니다.

예를 들면 다음과 같습니다.

typedef char *ASTRING;
const ASTRING astring;

의 유형이 astring있다 char * const, 없다 const char *. 이것이 제가 항상 const타입의 오른쪽에 두는 경향이 있고 시작하지 않는 이유 중 하나 입니다.


답변

거의 모든 사람들이 지적한 것처럼 :

무슨 사이의 차이점 const X* p, X* const p그리고 const X* const p?

포인터 선언을 오른쪽에서 왼쪽으로 읽어야합니다.

  • const X* p “p는 const 인 X를 가리킴”을 의미합니다. X 객체는 p를 통해 변경할 수 없습니다.

  • X* const p “p는 const가 아닌 X에 대한 const 포인터”를 의미합니다. 포인터 p 자체는 변경할 수 없지만 p를 통해 X 객체를 변경할 수 있습니다.

  • const X* const p “p는 const 인 X에 대한 const 포인터”를 의미합니다. 포인터 p 자체를 변경할 수 없으며 p를 통해 X 객체를 변경할 수도 없습니다.


답변

  1. 상수 참조 :

    상수 인 변수 (여기서 int)에 대한 참조입니다. 참조는 실제 값보다 크기가 작기 때문에 변수를 참조로 주로 전달하지만 부작용이 있으며 이는 실제 변수의 별칭과 유사하기 때문입니다. 별칭에 대한 전체 액세스를 통해 실수로 주요 변수를 변경할 수 있으므로 이러한 부작용을 방지하기 위해 변수를 일정하게 만듭니다.

    int var0 = 0;
    const int &ptr1 = var0;
    ptr1 = 8; // Error
    var0 = 6; // OK
  2. 상수 포인터

    상수 포인터가 변수를 가리키면 다른 변수를 가리킬 수 없습니다.

    int var1 = 1;
    int var2 = 0;
    
    int *const ptr2 = &var1;
    ptr2 = &var2; // Error
  3. 상수를 가리키는 포인터

    변수의 값을 변경할 수없는 포인터를 상수에 대한 포인터라고합니다.

    int const * ptr3 = &var2;
    *ptr3 = 4; // Error
  4. 상수에 대한 상수 포인터

    상수에 대한 상수 포인터는 가리키는 주소를 변경하거나 해당 주소에 유지 된 값을 변경할 수없는 포인터입니다.

    int var3 = 0;
    int var4 = 0;
    const int * const ptr4 = &var3;
    *ptr4 = 1;     // Error
     ptr4 = &var4; // Error

답변

일반적인 규칙은 const키워드가 바로 앞에 오는 항목에 적용된다는 것입니다. 예외적으로 시작은 const다음에 적용됩니다.

  • const int*“상수 int에 대한 포인터”int const* 와 동일 하고 의미 합니다.
  • const int* const“상수 int에 대한 상수 포인터”int const* const 와 동일 하고 의미 합니다.

편집 :
해야 할 일과하지 말아야 할 것입니다. 이 답변 으로 충분하지 않으면 원하는 것에 대해 더 정확할 수 있습니까?


답변

이 질문은 내가 왜 내 질문에서 언급 한 방식 이 형식 ID 허용 후 const 인 것을 좋아하는지 정확하게 보여줍니다 .

즉, 내가 규칙을 기억하는 가장 쉬운 방법을 찾아 “CONST는”가는 것입니다 가 적용되는 것. 따라서 귀하의 질문에서 “int const *”는 int가 상수임을 의미하고 “int * const”는 포인터가 상수임을 의미합니다.

누군가가 맨 앞에 배치하기로 결정한 경우 (예 : “const int *”),이 경우 특별한 예외로 그 뒤에있는 것에 적용됩니다.

많은 사람들이이 예외를 더 좋아 보인다고 생각하기 때문에이 예외를 사용하는 것을 좋아합니다. 나는 그것이 예외이기 때문에 그것을 싫어하여 혼란스럽게합니다.