programing

C와 C++에서 const pointer-to-point는 무엇을 의미합니까?

batch 2023. 6. 15. 21:42
반응형

C와 C++에서 const pointer-to-point는 무엇을 의미합니까?

저는 선언문을 오른쪽에서 왼쪽으로 읽는 습관을 알고 있으며 동료가 제게 다음과 같이 말하기 전까지는 무슨 일이 일어나고 있는지 알고 있다고 꽤 확신했습니다.

const MyStructure** ppMyStruct;

즉, "ppMyStruct는 (변동 가능한) MyStructure에 대한 const 포인터입니다"(C++).

나는 그것이 "ppMyStruct는 constMyStructure에 대한 포인터"를 의미한다고 생각했을 것입니다.C++ 스펙에서 답을 찾았지만, 제가 그걸 잘 못 하는 것 같아요...

C++에서 는 무엇을 의미하며, C에서도 같은 것을 의미합니까?

당신의 동료는 틀렸습니다.이것은 const MyStructure에 대한 (비정규) 포인터입니다.C와 C++ 모두에서.

이러한 경우 도구 cdecl(또는 c++decl)이 유용할 수 있습니다.

     [flolo@titan ~]$ cdecl explain "const struct s** ppMyStruct"
     declare ppMyStruct as pointer to pointer to const struct s

당신의 해석이 옳았습니다.여기 다른 관점이 있습니다.

const MyStructure *      *ppMyStruct;        // ptr --> ptr --> const MyStructure
      MyStructure *const *ppMyStruct;        // ptr --> const ptr --> MyStructure
      MyStructure *      *const ppMyStruct;  // const ptr --> ptr --> MyStructure

이것들은 모두 하나의 상수 한정자를 가진 포인터 대 포인터의 대안입니다.오른쪽에서 왼쪽으로 규칙을 사용하여 선언을 해독할 수 있습니다(적어도 C++에서는 C 전문가가 아닙니다).

당신의 동료는 틀렸고, 그것은 C와 C++도 마찬가지입니다.다음을 시도합니다.

typedef struct foo_t {
    int i;
} foo_t;

int main()
{
    foo_t f = {123};
    const foo_t *p = &f;
    const foo_t **pp = &p;
    printf("f.i = %d\n", (*pp)->i);
    (*pp)->i = 888; // error
    p->i = 999;     // error
}

Visual C++ 2008은 마지막 두 줄에 대해 다음 오류를 표시합니다.

error C2166: l-value specifies const object
error C2166: l-value specifies const object

GCC 4는 다음과 같이 말합니다.

error: assignment of read-only location '**pp'
error: assignment of read-only location '*p'

G++ 4는 말합니다.

error: assignment of data-member 'foo_t::i' in read-only structure
error: assignment of data-member 'foo_t::i' in read-only structure

말이 맞아요.

다른 답변은 이미 "시계방향 나선형 규칙"을 가리켰습니다.하지만 저는 그것이 매우 마음에 들었습니다 - 약간 정교하긴 하지만.

다른 댓글들에 대한 결과로, 'const'를 먼저 넣지 마세요.그것은 정말 유형 다음에 속합니다.그것은 즉시 의미를 명확히 했을 것입니다. 그냥 평소처럼 RTL을 읽으십시오.

MyStructure const** ppMyStruct;
void Foo( int       *       ptr,
          int const *       ptrToConst,
          int       * const constPtr,
          int const * const constPtrToConst )
{
    *ptr = 0; // OK: modifies the pointee
    ptr  = 0; // OK: modifies the pointer

    *ptrToConst = 0; // Error! Cannot modify the pointee
    ptrToConst  = 0; // OK: modifies the pointer

    *constPtr = 0; // OK: modifies the pointee
    constPtr  = 0; // Error! Cannot modify the pointer

    *constPtrToConst = 0; // Error! Cannot modify the pointee
    constPtrToConst  = 0; // Error! Cannot modify the pointer
}

언급URL : https://stackoverflow.com/questions/336585/what-does-a-const-pointer-to-pointer-mean-in-c-and-in-c

반응형